我有一个NSTableView View-Based,它有可编辑的行,但如果用户点击文本而不是单元格的其余部分,则只允许编辑。 (见图)
有人知道如何使整个单元格可编辑,而不仅仅是显示文本的单元格区域?
答案 0 :(得分: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:
使用以下逻辑:
为所有提议的第一响应者视图返回
YES
,除非它们是NSControl
的实例或子类。- 醇>
确定建议的第一响应者是
NSControl
实例还是子类。
如果控件是
NSButton
对象,请返回YES
。如果控件不是
NSButton
,请调用控件的hitTestForEvent:inRect:ofView:
以查看命中区域是否为 可跟踪(即NSCellHitTrackableArea
)或是可编辑的文本 区域(即NSCellHitEditableTextArea
),并返回相应的 值。请注意,如果文本区域被点击,NSTableView
也会延迟 第一响应者行动。
我已经实现了NSTextFieldCell
的自定义子类。它唯一能做的就是覆盖hitTestForEvent(_:inRect:ofView:)
来调用super,记录结果并返回它。然后,我在表格单元格视图中设置文本字段,以将该自定义类用于其单元格。从那时起,我了解到单击文本字段的空白区域会产生.None
。点击实际文字会产生.ContentArea | .EditableTextArea
。
第一个结果不会导致NSTableView
validateProposedFirstResponder(_:forEvent:)
的实施,以允许建议的第一响应者实际成为第一响应者。后一种结果确实如此。
因此,您可以实现自己的NSTextFieldCell
子类,它会覆盖hitTestForEvent(_:inRect:ofView:)
。在你的覆盖中,你可以通过超级电话来打电话。如果结果为.None
,则在返回之前将其更改为.ContentArea | .EditableTextArea
。然后,将该自定义单元格类用于表格中的文本字段。
或者,您可以尝试使用覆盖NSTableView
的自定义validateProposedFirstResponder(_:forEvent:)
子类来解决此问题。问题在于重新实现该方法的逻辑并不是直截了当的,除了它响应的命中测试代码。