将 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
方法可能是最好的地方,因为它在 initWithFrame
和 initWithCoder
之后被调用:
override func awakeFromNib() {
delegate = self
dataSource = self
super.awakeFromNib()
}
我的应用程序将文本文件读入 [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
方法可能是最好的地方,因为它在 initWithFrame
和 initWithCoder
之后被调用:
override func awakeFromNib() {
delegate = self
dataSource = self
super.awakeFromNib()
}