【问题标题】:allowsSelectionDuringEditing property for NSTableViewNSTableView 的allowSelectionDuringEditing 属性
【发布时间】:2018-01-30 13:23:08
【问题描述】:

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

首先,想了解原因。

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

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

顺便说一句,虽然我现在知道如何编写自定义 UI 类并将它们连接到 Interface Builder 中,但我还在纠结何时/是否自定义 NSTableViewNSTableRowViewNSTableCellViewNSSegmentedControl。我试图了解refuseFirstResponder 的工作原理。反复试验并没有让我到任何地方 - 我修复了一些东西并打破了一些其他东西。如果有人可以建议除 Apple 文档之外的任何其他阅读材料(有时我怀疑它是否是英文的),我将不胜感激。

【问题讨论】:

  • 使用NSTableViewDelegate方法selectionShouldChange(in:)
  • 是的,我已经做到了。这是我的问题。
  • 是的,如果我的单元格中只有 NSTextFields,我已经做到了,并且工作得很好。如果应该保存当前选定的行,我会捕获该通知并提示用户。问题是当我添加另一个控件(例如 NSSegmentControl)并且用户在另一行的该列中单击时,我没有收到 selectionShouldChange 通知。所以我需要防止用户选择另一行,直到我完成我的 NSSegmentControl - 即直到我停止编辑我的行 - 只有“编辑”不像文本字段编辑而是选择我的段
  • 等一下,我应该仔细阅读的。我现在明白威勒克在说什么了。但是,为了防止选择更改,如何检测我的 NSSegmentControl 具有“焦点”并且仍在“编辑”?我想我可以使用 tableView.selectedRow 来获取 rowView 然后导航到 NSSegmentControl。然后呢?即使那样仍然不确定如何防止在段控件中的另一行中单击
  • 那么只有选中的行可以编辑,并且该行必须有效才能选择另一行?当用户单击另一行中的控件时,该控件应该处理单击还是应该首先选择该行并由控件处理下一次单击?

标签: nstableview


【解决方案1】:

我会这样做:

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

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
    }
}

【讨论】:

  • 不确定您是否看到我上面的评论。我能够通过继承 NSSegmentedControl 来解决我的问题。认为这是一个很好的解决方案,因为控件实现中包含代码更改,当然如果我的子类控件不在 tableView 中,那么我的代码都不会执行。我确实尝试过使用子类化 NSTableRowView 来执行您所说的操作,但我无法让它工作,因为当时我不知道使用正确标识符让 IB 使用它的技巧。我一定会调查的。
猜你喜欢
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多