Macos 在Swift中有条件地在表视图中显示图像视图

Macos 在Swift中有条件地在表视图中显示图像视图,macos,cocoa,swift4,nstableview,nsimageview,Macos,Cocoa,Swift4,Nstableview,Nsimageview,我试图在布尔值条件下在表视图单元格视图中显示图像 布尔值表示类“Book”中对象的状态,对象在该类中初始化: 类目:NSObject,可编码{ @objc动态变量作者:字符串 @objc动态变量标题:字符串 @objc动态变量lentBy:字符串 @objc动态变量可用:Bool{ 如果lentBy==“”{ 返回真值 }else{return false} } init(作者:String,标题:String,lentBy:String){ self.author=作者 self.title=

我试图在布尔值条件下在表视图单元格视图中显示图像

布尔值表示类“Book”中对象的状态,对象在该类中初始化:

类目:NSObject,可编码{
@objc动态变量作者:字符串
@objc动态变量标题:字符串
@objc动态变量lentBy:字符串
@objc动态变量可用:Bool{
如果lentBy==“”{
返回真值
}else{return false}
}
init(作者:String,标题:String,lentBy:String){
self.author=作者
self.title=标题
self.lentBy=lentBy
}
}
如果未指定字符串
lentBy
,Bool
available
将返回true:没有人借阅过这本书,因此它应该是可用的。将
available
对象绑定到表视图,相应的表视图单元格显示1或0。我希望它显示图像,而不是1或0:
NSStatusAvailable
NSStatusAvailable

看看这个:。 如果文本字段“Geliehen von”(借阅人)为空,则状态为1,应显示绿色圆圈;否则就是一个红色的圆圈。您现在看到的绿色圆圈只是简单地拖到表格单元格视图中,不起作用。但这就是我的想法

现在我想知道如何显示相应的图像视图,而不是Bool 1或0

表格视图是在情节提要中使用界面生成器构建的。如果我试图以编程方式对其进行更改,那么表视图中将不再显示任何内容。我想这是由于集合绑定造成的。仅删除最后一列的绑定不起作用。我就是这样尝试的(没有实现图像视图;我不知道如何通过编程实现):

func tableView(tableView:NSTableView,viewFor tableColumn:NSTableColumn?,行:Int)->NSView?{
如果tableColumn==tableView.tableColumns[2]{
让cellIdentifier=“statusCellID”
将cell=tableView.makeView(标识符为NSUserInterfaceItemIdentifier(rawValue:cellIdentifier),所有者为self)设为?NSTextField
如果let cell=cell{
cell.identifier=NSUserInterfaceItemIdentifier(原始值:cellIdentifier)
cell.stringValue=books[row].lentBy
}
返回单元
}
归零
}

实现这一目标的最佳解决方案是什么?我是否可以不使用Bool,直接返回相应的CGImage类型(例如,
lentBy
s representation
available

您使用的是Cocoa绑定。这使它非常容易

  • 在Interface Builder中,将带有图像视图的
    NSTableCellView
    拖动到最后一列中,并删除当前列
  • 删除文本字段并为图像视图设置适当的约束
  • 而不是
    viewForColumn:Row
    implement

    func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
        return books[row]
    }
    
  • 使用KVO驱动的
    image
    属性扩展模型

    class Book: NSObject, Codable {
            @objc dynamic var author: String
            @objc dynamic var title: String
            @objc dynamic var lentBy: String
    
            @objc dynamic var available: Bool {
                return lentBy.isEmpty
            }
    
            @objc dynamic var image: NSImage {
                return NSImage(named: (lentBy.isEmpty) ? NSImage.statusAvailableName : NSImage.statusUnavailableName)!
            }
    
            static func keyPathsForValuesAffectingImage() -> Set<String> { return ["lentBy"] }
    
            init(author: String, title: String, lentBy: String) {
                self.author = author
                self.title = title
                self.lentBy = lentBy
    
            }
        }
    
    类目:NSObject,可编码{
    @objc动态变量作者:字符串
    @objc动态变量标题:字符串
    @objc动态变量lentBy:字符串
    @objc动态变量可用:Bool{
    返回lentBy.isEmpty
    }
    @objc动态var映像:NSImage{
    返回NSImage(名为:(lentBy.isEmpty)?NSImage.statusAvailableName:NSImage.statusAvailableName)!
    }
    static func keypathsforvaluesafectingimage()->Set{return[“lentBy”]}
    init(作者:String,标题:String,lentBy:String){
    self.author=作者
    self.title=标题
    self.lentBy=lentBy
    }
    }
    
  • 在Interface Builder中,将表格单元格视图的图像视图的
    绑定到
    表格单元格视图
    objectValue.image


太棒了!再次感谢瓦迪安人!我不太明白设置{return[“lentBy”]}的作用,你能解释一下吗?另外,Xcode要求我更正一小段代码:
NSImage.Name.statusAvailable
而不是
NSImage.statusAvailableName
。如果你曾经写过一本关于macOS编程的书,请告诉我更新你的Swift版本。在4.2+中,它是
NSImage.statusAvailableName
keypathsforvaluesafecting
是一个键值观察者。当
lentBy
(返回的键路径集)的值更改时,它通知
image
属性(注意后缀
image()
)。
dynamic
关键字aka Cocoa Bindings实际上做了同样的事情。