显示图像 在 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:NSStatusAvailableNSStatusUnavailable.

看看这个: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,例如lentBys 表示的 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