【问题标题】:How do I access an ImageView within an NSTableCellView in Swift?如何在 Swift 中访问 NSTableCellView 中的 ImageView?
【发布时间】:2021-12-22 10:58:53
【问题描述】:

我正在尝试使用已在数组(标志)中定义的图像以编程方式填充列的单元格。

在 IB 中,我在表格单元格视图中直接有一个图像视图。在 ViewController 中,这就是我正在做的事情:

   public func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
      
      guard let cellView = tableView.makeView(withIdentifier: tableColumn!.identifier, owner: self) as? NSTableCellView else { return nil }
      
      if tableColumn?.title == "flag" {
         cellView.imageView?.image = NSImage(named: flags[row])   // NOT WORKING
      } else if tableColumn?.title == "country" {
         cellView.textField?.stringValue = flags[row].uppercased()
      }
      
      return cellView
   }

这会导致“国家”列中的文本字段单元格设置得很好,但“标志”列中的每个单元格都有我在 IB 中设置的默认图像——或者如果我把它拿出来就什么都没有。

根据我浏览过的教程和 StackOverflow 帖子,似乎我做的一切都是正确的——但显然我搞砸了。

【问题讨论】:

  • 你有很多 ?. 的用法,这只是乞求这样的错误。 cellView.imageView?.image = 表示“如果这个cellViewimageViewnil,则绝对什么也不做”。好吧,正如您所要求的那样,绝对没有发生任何事情! :) 最好强制展开,因为如果特定单元格没有 imageView,那是由程序中的问题引起的错误,在运行时无法恢复。
  • 单元格视图的imageView出口是否连接到图像视图?
  • NSImage(named: flags[row]) 是否返回图像?
  • @Alexander:谢谢!如果我强制展开它肯定会崩溃,这似乎告诉我 cellView 没有 imageView。 (对吗?)不幸的是,我仍然不确定这是为什么。
  • @Willeke:是的,NSImage(named: flags[row]) 在别处返回图像。至于你的另一个问题,我不确定——我不这么认为,因为我手动连接的唯一插座是tableView

标签: swift macos nstableview


【解决方案1】:

(回应cmets分享的截图)

注意图像视图(在单元格中)没有被任何东西引用(其右侧的“引用插座”部分是空的)。

您的图像视图是其单元格的子视图(如其在左侧栏中的视图层次结构中的位置所示),因此您可能可以使用以下方式访问它:

let imageView = cell.subViews.first(where: { $0 is NSImageView }) as! NSImageView
imageView.image = NSImage(named: flags[row])

...但这显然很笨重。

相反,您应该选择您的单元格,然后从其imageView 出口拖动到图像视图。这将产生一个新的引用,这将使cell.imageView 非零。

或者,我建议您删除单元格,然后从“对象库”的“图像和测试表单元格视图”中创建一个新单元格。它已经连接了所有网点。

【讨论】:

  • 按照您的建议连接插座有效。谢谢!我还尝试了“图像和文本表格单元格视图”,它也有效。
  • 很高兴听到这个消息。对不起,你必须经历这个,我敢打赌这很令人沮丧。将来,我建议在?. 周围谨慎使用它很方便,是的,可以消除故障。有时这是一件好事,但有时却不是这样。
  • 但是* 可以消除失败
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 2015-11-17
  • 2014-09-23
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多