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

时间:2019-05-13 07:06:39

标签: macos cocoa swift4 nstableview nsimageview

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

布尔值表示初始化对象的“ 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:NSStatusAvailableNSStatusUnavailable

看看这个: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类型?

1 个答案:

答案 0 :(得分:1)

您正在使用可可绑定。这很容易。

  • 在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中,将表格单元格视图的图像视图的Value绑定到Table Cell View> objectValue.image