NSTableView 中的自定义 NSView 未显示所有子视图

Custom NSView in NSTableView not showing all subviews

我正在尝试创建自定义 NSView 以显示在基于视图的 NSTableView 中的列中。该视图包含 2 个子视图,一个 NSTextField 和一个 NSButton。我希望按钮保持约束设置的宽度,并在 NSView 调整大小时调整文本字段的大小。下面是一个小动画,显示 NSView 及其子视图,以及我创建的约束。

如您所见,调整 NSView 的大小符合预期。

现在,当在 NSTableView 中显示此自定义 NSView 时,按钮看起来就像消失了,调整列的大小会使文本字段随之调整大小('Category'列)。

用于在 tableView:viewForTableColumn:row 中创建 NSView 的代码:

let identifier = tableColumn!.identifier

if identifier == "Category" {
    var view = tableView.makeViewWithIdentifier(identifier, owner: self) as? TableCategoryView

    if view == nil {
        view = TableCategoryView(frame: tableView.frame)
        view!.identifier = identifier
    }

    return view
 }

奇怪的是,当 2 个视图没有约束时,按钮和文本字段都愉快地显示在列内,但是它们当然不会随 table 列宽调整大小.

我做错了什么?

编辑: 看起来还有其他问题。 NSView 本身根本没有使用 table 列调整大小。

我认为 TableCategoryView 是您的新 class,它是 NSView 的子class,将替换您在创建时获得的 NSTableCellView (在 IB 中)基于 NSTableView 的视图。如果你真的想创建自己的 TableCellView 它应该是 NSTableCellView 的直接子 class 而不是 NSView.

但在您的情况下(向 TableCellView 添加一个按钮)您不需要创建新的 class。现有的 TableCellView 对象已经有一个名为 textField 的 TextField(属性)。然后简单地拖(意味着:添加)一个按钮到现有的 TableCellView 中(调整它的大小并设置约束)并将一个 link 从按钮拖到 TableView 的委托中的相应方法。在 "corresponding method" 中,您可以询问点击的行和列,并识别点击按钮。我为 TableView 这样做了,对我来说效果很好。