【问题标题】:NSTableView, making it user-friendlyNSTableView,使其用户友好
【发布时间】:2016-03-20 22:05:45
【问题描述】:

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

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

【问题讨论】:

  • 你在使用裸NSTextField as 单元格视图吗?还是单元格视图是容器视图,例如NSTableCellView,而文本字段是它的子视图?如果是后者,您在文本字段及其容器之间设置了哪些约束?
  • 感谢您的回答,我使用显示单元格层次结构的图像编辑了问题

标签: swift macos cell nstableview user-friendly


【解决方案1】:

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

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

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

因此,除此之外,问题在于NSTableView 如何管理点击,以及他们是否将点击的视图设置为第一响应者。从Table View Programming Guide for Mac: Enabling Row Selection and User Actions – Specifying How Subviews Should Respond to Events,我们了解到表格视图在validateProposedFirstResponder(_:forEvent:)的覆盖中实现了特殊逻辑:

默认NSTableView实现 validateProposedFirstResponder:forEvent: 使用以下逻辑:

  1. 为所有建议的第一响应者视图返回 YES,除非它们是 NSControl 的实例或子类。

  2. 确定提议的第一响应者是NSControl 实例还是子类。

    • 如果控件是NSButton对象,则返回YES

    • 如果控件不是NSButton,则调用控件的hitTestForEvent:inRect:ofView:查看命中区域是否为 可追踪(即NSCellHitTrackableArea)或者是可编辑的文本 区域(即NSCellHitEditableTextArea),并返回相应的 价值。请注意,如果点击了文本区域,NSTableView 也会延迟 第一响应者行动。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    相关资源
    最近更新 更多