将 NSTableView 的委托和数据源连接到自定义子类?

Connecting NSTableView's delegate and dataSource to a custom subclass?

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

我曾经将所有控制器代码放在一个 VC 中,但随着表数量的增加,此代码的复杂性也随之增加。由于视图主要在布局和一些默认设置上有所不同,因此它们都可以从单个 class 派生。所以我做了:

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

举个例子...

class GeometryView: CardView { ...

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

所以...这些 IB 设置的目标是否必须是特定的子class,比如 NSViewController?还是我遗漏了什么让 IB 将这些视为目标?我没有在原始 VC 中做任何事情,它只是起作用了。还是我只是在 IB 中做错了事?

在此图中,您可以看到最左侧的表视图、帮助程序中的自定义视图子class,以及右侧表视图的连接。任何从连接拖到助手中任何地方的尝试都会失败。请注意,现有的两个连接是针对前一个委托 VC,这是我要替换的。

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

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

    super.awakeFromNib()
}