【问题标题】:Connecting NSTableView's delegate and dataSource to a custom subclass?将 NSTableView 的委托和数据源连接到自定义子类?
【发布时间】:2016-02-19 15:51:29
【问题描述】:

我的应用程序将文本文件读入[Card]。每张卡片的前面都有一个两个字母的代码,我根据该代码将卡片分成不同的 NSTableView。这让我可以在 IB 中设置布局,以便每组卡片都有适当的显示。

我曾经在一个 VC 中拥有所有控制器代码,但随着表数量的增加,该代码的复杂性也随之增加。由于视图的主要区别在于布局和一些默认设置,它们都可以从一个类继承。所以我做了:

class CardView: NSTableView, NSTableViewDataSource, NSTableViewDelegate { ...

举个例子……

class GeometryView: CardView { ...

然后我去了IB,选择了tableview,并将其类更改为GeometryView。现在我必须设置委托和数据源,这就是我的问题所在:IB 不允许我将任一设置拖到 GeometryView 或 CardView。

那么...这些 IB 设置的目标是否必须是特定的子类,比如 NSViewController?还是我缺少什么让 IB 将这些视为目标?我没有在原始 VC 中做任何事情,它只是工作。还是我只是在 IB 做错事?

在这张图片中,您可以看到最左侧的 tableview、助手中的自定义视图子类以及右侧的 tableview 连接。任何从连接拖动到助手中任何位置的尝试都会失败。请注意,现有的两个连接是到前一个委托 VC,这是我要替换的。

【问题讨论】:

  • 添加您正在尝试执行的操作的屏幕截图,按照您描述的方式使用 IB 链接委托或数据源应该没有问题。
  • 我没有从截图中看出问题,这是它应该看起来像drive.google.com/file/d/0BxUbHGaoHgxtcUwxTE44Z2FrdlE/…
  • @A-Live:两者之间有区别-似乎您在tableview中有一个tableview?我在 IB 中创建的 tableview 位于 ClipView 中。在您的情况下,您将 tableView 的委托连接到其他对象,而在我的情况下,它是同一个对象。我不相信这也适用于您的示例 - 尝试拖动到“表格视图”。
  • 这是在 IB 创建的标准表格视图。

标签: swift nstableview


【解决方案1】:

我不确定为什么 Interface Builder 不允许您将委托或数据源连接到自身,但您可以通过编程方式完成。 awakeFromNib 方法可能是最好的地方,因为它在 initWithFrameinitWithCoder 之后调用:

override func awakeFromNib() {
    delegate = self
    dataSource = self

    super.awakeFromNib()
}

【讨论】:

  • 非常有用!你知道默认是什么吗?例如,默认委托是“self”还是“nil”?
  • 好的,我将该代码 C&Ped 到我的基类 class CardView: NSTableView, NSTableViewDataSource, NSTableViewDelegate 中,但它响应“无法分配给属性:'self' 是不可变的。我假设 self 不是对,但在左边是看不见的,self.dataSource
  • 啊,是self.setDelegate(self)等
  • self 是不可变的?这很奇怪。我是一名 iOS 程序员,我的代码运行良好。据我所知,self.setDelegate(self)self.delegate = self 在 Swift 中是等价的......
  • 是的,这有点奇怪,不是吗。我正在将其归档到雷达中。
猜你喜欢
  • 2012-06-25
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
相关资源
最近更新 更多