allowsSelectionDuringEditing 属性 用于 NSTableView

allowsSelectionDuringEditing property for NSTableView

我正在尝试开发的应用程序主要围绕能够拥有可编辑的 TableView 而构建。我开始得出结论,我的大部分(如果不是全部)问题都源于这样一个事实,即我没有看到 allowsSelectionDuringEditing 可用于 NSTableView,因为它适用于 UITableView。

首先,想深入了解原因。

其次,如何在我的 NSTableView 中实现一个 class?

最后,我的一个专栏中有一个 NSSegmentedControl。所以我需要在某个地方实现 allowSelectiongWhenFocused 属性 ,因为虽然我专注于按钮并允许用户使用 <- 和 -> 空格键到 select 开关,但我不不希望鼠标/键盘更改 selected 行。

顺便说一句,虽然我现在知道如何编写自定义 UI classes 并将它们挂接到 Interface Builder 中,但我正在努力 when/whether 自定义 NSTableViewNSTableRowViewNSTableCellViewNSSegmentedControl。我也试图了解 refuseFirstResponder 的工作原理。反复试验并不能使我到达任何地方——我修复了一些东西,又破坏了一些其他东西。如果有人可以建议除了 Apple 文档之外的任何其他阅读材料(有时我怀疑它是不是英文的),我将不胜感激。

我会这样做:

子类 NSTableRowView 并覆盖 hitTest(_:)。如果未选择行,则行视图 returns 本身而不是控件。第一次单击一行会选中该行并且不会更改控件的值。

override func hitTest(_ point: NSPoint) -> NSView? {
    let view = super.hitTest(point)
    if view == nil || self.isSelected {
        return view
    }
    else {
        return self
    }
}

实施 NSTableViewDelegatetableView(_:rowViewForRow:) 以使用自定义行视图:

func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? {
    return MyTableRowView()
}

实施 NSTableViewDelegateselectionShouldChange(in:),以便在值无效或不满足其他条件时无法取消选择行。

func selectionShouldChange(in tableView: NSTableView) -> Bool {
    let row = tableView.selectedRow
    if (row >= 0) {
        return self.validateRow(row)
    }
    else {
        return true
    }
}