提问人:CocoaNut 提问时间:9/13/2023 更新时间:9/13/2023 访问量:24
以编程方式填充一个表视图,使用 IB 绑定填充其他表视图
Programmatically fill one tableview, use IB bindings to fill others
问:
在 xib 中创建一个窗口,它包含两个表视图,A 和 B。在界面构建器中,A 和 B 都将文件的所有者设置为委托,因为两者都会使用一些委托方法,例如用于拖放。
我想以编程方式填充表 A,即使用 ,但我仍然想使用界面构建器中的“绑定”选项卡填充表 B。-tableView:viewForTableColumn:row:
这直接可能吗?
似乎在我的情况下,将两个表视图的委托设置为文件的所有者将自动意味着使用委托方法填充 B,覆盖 IB 中设置的任何内容。
答:
0赞
Willeke
9/13/2023
#1
似乎在我的情况下,将两个表视图的委托设置为文件的所有者将自动意味着使用委托方法填充 B,覆盖 IB 中设置的任何内容。
不可以,绑定可以很好地协同工作。只需按照文档所说的去做:tableView:viewForTableColumn:row:
建议此方法的实现首先调用 NSTableView 方法 makeViewWithIdentifier:owner:,分别传递 tableColumn 参数的标识符和 self 作为所有者,以尝试重用不再可见的视图或自动取消存档该标识符的关联原型视图。
使用 Cocoa 绑定时,如果在设计时至少有一个标识符与表视图相关联,则此方法是可选的。(请注意,视图的标识符必须与其列的标识符相同。实现此目的的一种简单方法是使用 Interface Builder 中的 Automatic identifier 设置。
例:
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
if (tableView == self.tableViewA) {
MyTableCellView *cellView = [tableView makeViewWithIdentifier:myIdentifier owner:self];
cellView.customView.data = myData;
return cellView;
}
else {
return [tableView makeViewWithIdentifier:tableColumn.identifier owner:self];
}
}
评论
0赞
CocoaNut
9/13/2023
嗯,我实现了您提供的方法(进行了适当的更改),现在表 B 已填充,但行显示空字符串(单击该行仍会选择正确的数据,如日志记录所示) - 因此,与 IB 中的配置不同。并且根本没有填充表 A。我想我的问题可能更具体/在其他地方。numberOfRowsInTableView
0赞
CocoaNut
9/13/2023
因此,在 IB 中,该列仅包含一个 NSTextFieldCell - 我更改了它,现在您的解决方案适用于表 A。但是,对于表 B,似乎无法在 IB 中设置值,因此我也将仅以编程方式设置它们,嗯。
0赞
Willeke
9/13/2023
文件的所有者是否也是数据源?应该也一样好用。绑定很难调试,数据源和委托更容易。
0赞
CocoaNut
9/13/2023
对于这两个表,它既是数据源,又是委托。但是我(我们)现在想通了:表的内容绑定必须设置为它们各自的 arraycontroller(更确切地说,是它们的 arrangedObjects)。这在以前是没有必要的,因为两个表都是从 xib 填充的
评论