我正在尝试在布尔值条件下在表格视图单元格视图中显示图像。
布尔值表示初始化对象的“ Book”类对象的状态:
class Book: NSObject, Codable {
@objc dynamic var author: String
@objc dynamic var title: String
@objc dynamic var lentBy: String
@objc dynamic var available: Bool {
if lentBy == "" {
return true
} else {return false}
}
init(author: String, title: String, lentBy: String) {
self.author = author
self.title = title
self.lentBy = lentBy
}
}
如果未指定字符串lentBy
,则布尔available
返回true:没有人借出该书,因此该书应该可用。将available
对象绑定到表格视图,相应的表格视图单元格显示1或0。我希望它显示图像而不是1或0:NSStatusAvailable
或NSStatusUnavailable
。
看看这个:https://i.imgur.com/xkp0znT.png。 文本字段“ Geliehen von”(借出)为空时,状态为1,应显示绿色圆圈;否则为红色圆圈。您现在看到的绿色圆圈只是被拖到表格单元格视图中,并且没有任何作用。但这就是主意。
现在,我想知道如何显示相应的图像视图而不是布尔1或0。
表视图是使用情节提要中的界面构建器构造的。如果我试图以编程方式对其进行更改,则表视图中将不再显示任何内容。我想这是由于绑定所致。仅删除最后一列的绑定无效。这就是我尝试过的方式(没有实现图片视图;我不知道如何通过编程方式做到这一点):
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
if tableColumn == tableView.tableColumns[2] {
let cellIdentifier = "statusCellID"
let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: cellIdentifier), owner: self) as? NSTextField
if let cell = cell {
cell.identifier = NSUserInterfaceItemIdentifier(rawValue: cellIdentifier)
cell.stringValue = books[row].lentBy
}
return cell
}
return nil
}
实现此目标的最佳解决方案是什么?我可以以某种方式而不是Bool直接返回相应的内容,例如lentBy
表示形式available
的CGImage类型?
答案 0 :(得分:1)
您正在使用可可绑定。这很容易。
NSTableCellView
具有图像视图拖到最后一列,然后删除当前列。而不是viewForColumn:Row
实现
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
}
}
在Interface Builder中,将表格单元格视图的图像视图的Value
绑定到Table Cell View
> objectValue.image