显示图像 在 Table 中查看 在 Swift 中有条件地查看
Display Image View in Table View conditionally in Swift
我正在尝试在 table 视图单元格视图中显示布尔值条件下的图像。
布尔值表示 class "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
return 为真:没有人借出这本书,因此它应该可用。将 available
对象绑定到 table 视图,相应的 table 视图单元格显示 1 或 0。我希望它显示图像而不是 1 或 0:NSStatusAvailable
或 NSStatusUnavailable
.
看看这个:https://i.imgur.com/xkp0znT.png。
其中文本字段 "Geliehen von"(借出者)为空,状态为 1,应显示绿色圆圈;否则为红色圆圈。您现在看到的绿色圆圈只是简单地拖到 table 单元格视图中,没有任何功能。但这是想法。
现在我想知道如何显示相应的图像视图而不是 Bool 1 或 0。
table 视图是使用故事板中的界面生成器构建的。如果我尝试以编程方式对其进行更改,table 视图中将不再显示任何内容。我想这是由于设置绑定。仅删除最后一列的绑定不起作用。这就是我的尝试方式(没有实现图像视图;我不知道如何以编程方式执行此操作):
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
}
实现此目标的最佳解决方案是什么?我能不能以某种方式直接 return 各自的,而不是 Bool,例如lentBy
s 表示的 CGImage 类型 available
?
您正在使用 Cocoa 绑定。这使它变得非常容易。
- 在 Interface Builder 中将带有图像视图的
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 中将 table 单元格视图的图像视图的 Value
绑定到 Table Cell View
> objectValue.image
我正在尝试在 table 视图单元格视图中显示布尔值条件下的图像。
布尔值表示 class "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
return 为真:没有人借出这本书,因此它应该可用。将 available
对象绑定到 table 视图,相应的 table 视图单元格显示 1 或 0。我希望它显示图像而不是 1 或 0:NSStatusAvailable
或 NSStatusUnavailable
.
看看这个:https://i.imgur.com/xkp0znT.png。 其中文本字段 "Geliehen von"(借出者)为空,状态为 1,应显示绿色圆圈;否则为红色圆圈。您现在看到的绿色圆圈只是简单地拖到 table 单元格视图中,没有任何功能。但这是想法。
现在我想知道如何显示相应的图像视图而不是 Bool 1 或 0。
table 视图是使用故事板中的界面生成器构建的。如果我尝试以编程方式对其进行更改,table 视图中将不再显示任何内容。我想这是由于设置绑定。仅删除最后一列的绑定不起作用。这就是我的尝试方式(没有实现图像视图;我不知道如何以编程方式执行此操作):
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
}
实现此目标的最佳解决方案是什么?我能不能以某种方式直接 return 各自的,而不是 Bool,例如lentBy
s 表示的 CGImage 类型 available
?
您正在使用 Cocoa 绑定。这使它变得非常容易。
- 在 Interface Builder 中将带有图像视图的
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 中将 table 单元格视图的图像视图的
Value
绑定到Table Cell View
>objectValue.image