【问题标题】:Display Image View in Table View conditionally in Swift在 Swift 中有条件地在表格视图中显示图像视图
【发布时间】:2019-05-13 07:06:39
【问题描述】:

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

布尔值表示“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,应显示绿色圆圈;否则为红色圆圈。您现在看到的绿色圆圈只是被拖到表格单元格视图中并且不起作用。但这就是想法。

现在我想知道如何显示相应的图像视图而不是 Bool 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 直接返回相应的,例如lentBys 表示 available 的 CGImage 类型?

【问题讨论】:

    标签: macos cocoa swift4 nstableview nsimageview


    【解决方案1】:

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

    【讨论】:

    • 太棒了!非常感谢你,再次!我不太明白static func keyPathsForValuesAffectingImage() -&gt; Set&lt;String&gt; { return ["lentBy"] } 的目的,你介意解释一下吗?此外,Xcode 要求我更正您的一小段代码:NSImage.Name.statusAvailable 而不是 NSImage.statusAvailableName。如果你曾经写过一本关于 macOS 编程的书,请告诉我?! Nochmals danke und beste Grüße in die Schweiz!
    • 更新你的 Swift 版本。在 4.2+ 中,它是 NSImage.statusAvailableName。 – keyPathsForValuesAffecting&lt;Value&gt; 是一个键值观察者。当lentBy(返回的键路径集)的值发生变化时,它会通知image 属性(注意后缀Image())。 dynamic 关键字 aka Cocoa Bindings 实际上做同样的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多