Macos 在Swift中有条件地在表视图中显示图像视图
我试图在布尔值条件下在表视图单元格视图中显示图像 布尔值表示类“Book”中对象的状态,对象在该类中初始化: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=
类目:NSObject,可编码{
@objc动态变量作者:字符串
@objc动态变量标题:字符串
@objc动态变量lentBy:字符串
@objc动态变量可用:Bool{
如果lentBy==“”{
返回真值
}else{return false}
}
init(作者:String,标题:String,lentBy:String){
self.author=作者
self.title=标题
self.lentBy=lentBy
}
}
如果未指定字符串lentBy
,Boolavailable
将返回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 representationavailable
?您使用的是Cocoa绑定。这使它非常容易
- 在Interface Builder中,将带有图像视图的
拖动到最后一列中,并删除当前列NSTableCellView
- 删除文本字段并为图像视图设置适当的约束
- 而不是
implementviewForColumn: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 } }
类目: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
NSImage.Name.statusAvailable
而不是NSImage.statusAvailableName
。如果你曾经写过一本关于macOS编程的书,请告诉我更新你的Swift版本。在4.2+中,它是NSImage.statusAvailableName
keypathsforvaluesafecting
是一个键值观察者。当lentBy
(返回的键路径集)的值更改时,它通知image
属性(注意后缀image()
)。dynamic
关键字aka Cocoa Bindings实际上做了同样的事情。