swift - NSTableView,使它对用户友好

标签 swift macos cell nstableview user-friendly

我有一个基于 NSTableView View 的具有可编辑行的 View ,但如果用户单击文本而不是单元格的其余部分,则只允许编辑。 (见图)

有人知道如何使整个单元格都可编辑,而不仅仅是显示文本的单元格区域吗?

TableView

The cell

最佳答案

我相信我明白发生了什么。

首先,您能否确认在实际编辑文本字段时,焦点环是否包含整个表格单元格?它不仅仅是围绕实际的当前文本,对吧?

如果它包含整个表格单元格,则确认约束正在拉伸(stretch)它以填充表格单元格而不是包含其内容的文本字段。换句话说,我试图确认图像中的“不可编辑”箭头确实指向文本字段的一部分。我希望如此。

所以,除了这个,问题是 NSTableView 如何管理点击以及它们是否将点击 View 设置为第一响应者。来自 Table View Programming Guide for Mac: Enabling Row Selection and User Actions – Specifying How Subviews Should Respond to Events ,我们了解到 TableView 在 validateProposedFirstResponder(_:forEvent:) 的重写中实现了特殊逻辑:

The default NSTableView implementation of validateProposedFirstResponder:forEvent: uses the following logic:

  1. Return YES for all proposed first responder views unless they are instances or subclasses of NSControl.

  2. Determine whether the proposed first responder is an NSControl instance or subclass.

    • If the control is an NSButton object, return YES.

    • If the control is not an NSButton, call the control’s hitTestForEvent:inRect:ofView: to see whether the hit area is trackable (that is, NSCellHitTrackableArea) or is an editable text area (that is, NSCellHitEditableTextArea), and return the appropriate value. Note that if a text area is hit, NSTableView also delays the first responder action.

我已经实现了 NSTextFieldCell 的自定义子类。它唯一做的就是覆盖 hitTestForEvent(_:inRect:ofView:) 以调用 super,记录结果并返回它。然后,我将表格单元格 View 中的文本字段设置为其单元格使用该自定义类。从那里,我了解到单击文本字段的空白区域会导致 .None。单击 .ContentArea | 中的实际文本结果.EditableTextArea.

第一个结果不会导致 NSTableView 实现 validateProposedFirstResponder(_:forEvent:) 以允许提议的第一响应者实际成为第一响应者。后一个结果确实如此。

因此,您可以实现自己的 NSTextFieldCell 子类,它会覆盖 hitTestForEvent(_:inRect:ofView:)。在你的覆盖中,你会调用 super 。如果结果是 .None,您可以将其更改为 .ContentArea | .EditableTextArea 在返回之前。然后,将该自定义单元格类用于表格中的文本字段。

或者,您可以尝试使用 NSTableView 的自定义子类来解决此问题,该子类覆盖 validateProposedFirstResponder(_:forEvent:)。问题是重新实现该方法的逻辑并不简单,除非它响应哪些 HitTest 代码。

关于swift - NSTableView,使它对用户友好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36120210/

相关文章:

ios - 'sliderChanged : unrecognized selector sent to instance'

ios - 在 Swift 中将 NSUserDefaults 与 suiteName 一起使用

iphone - 有没有办法将 iOS 应用程序转换为 Mac OS X 应用程序?

Python 函数引用

excel - vba复制不连续范围单元格

swift - tvOS:关注自定义 UITableViewCell 时 UILabel 不调整大小

ios - Swift 4 - 将类结构的 JSON 响应嵌套到 TableViewCell 中

ios - 使用 alamofire 和 swiftyJson 从 UICollectionViewCell 内的 UICollectionView 的 api 中获取数据

Java 8,用于 Mac OS X 上的 IntelliJ

iphone - 维护分组的 UITableViewCell 宽度