NSTableView 内的 NSTableViewCell

Posted

技术标签:

【中文标题】NSTableView 内的 NSTableViewCell【英文标题】:NSTableView inside an NSTableViewCell 【发布时间】:2018-07-06 20:45:13 【问题描述】:

我正在尝试在 NSTableViewCell 中使用 NSTableView,但在禁用滚动时遇到问题。外部 tableview 可视化对象列表 - 在我的例子中是 3D 材料定义 - 在每个单元格内我使用(以及其他控件)另一个 tableview 来表示材料的属性(这是一个可以改变大小的动态列表)。

材料A 属性 1 属性 2 属性 3 材料B 属性 1 材料C ...

这很好用,除了一件事:

两个 tableview 都使用动态行高,这会导致外部 table view 单元格将内部 tableview 折叠到 0px 高度。有没有办法禁用内部表格视图的滚动并使其使用足够的高度来显示所有元素?更复杂的是,属性映射到不同的单元格定义(基于属性的类型),并且所有这些单元格都在 Interface Builder 中设置。因此,使用 NSView 并将其类型设置为 NSTableView 以避免 NSScrollView 或对所有控件进行编程构造并不是真正的选择。

非常感谢任何提示!

【问题讨论】:

看起来像大纲视图。 【参考方案1】:

更新:使用 TableViews

您也可以使用NSTableView 来实现您想要实现的目标。与 UITableView 不同,NSTableView 本身不进行滚动。它被包裹在NSClipView 中,而NSClipView 本身也被包裹在NSScrollView 中。因此,您只需从中提取 tableView 并添加一些约束。

界面生成器目前还不能很好地支持。您不能将 tableView 拖出其封闭的 clipView。但是您可以将接口文件作为源代码打开并删除从 scrollView 开始的所有内容(除了表格本身)。 tableView 应该在 Interface Builder 中正常显示(在 Xcode 9 和 10 上测试)

你必须在代码中添加约束,但是 tableView 应该自己增长。


由于内部表格视图不必滚动,您可以只使用NSStackView 来布局您的视图。那你就不用对抗NSTableView的行为了。 如果您需要示例,请随时询问!

【讨论】:

我正在考虑这个问题。但是,使用 tableview 使实现非常优雅,因为我可以在 Interface Builder 中为各种行类型设计单元格,在 NSDataSource 委托中返回对象数组并使用几个绑定及其向下。使用 NSStackView,我必须在列表更改时添加/删除条目,手动为一行分配正确的视图,而不仅仅是使用单元格标识符。

以上是关于NSTableView 内的 NSTableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

tableCellView 内的 NSButton:如何对基于视图的 NSTableView/NSArrayController 使用“动作调用”

使用 WebService 更新 TableView 并保存到 CoreData

使用核心数据存储对 NSTableView 的拖放支持

拖出 NSTableView 以移除

NSTableView:创建“重叠”行

NSTableView 意外调整大小