我有一个基于视图的NSOutlineView
,该视图配置了dataSource和委托。它由两列组成,一个自定义NSTableCellView
类。
通过选择一行并按【{1】】键可以编辑大纲视图中的条目。一切都是根据文档设置的,并且在大多数情况下都可以正常工作。
但是,有时当我在选择一行时按Return
时,单元格的文本字段不会进入编辑模式。它只是发出哔哔声。
我仍然可以通过在文本字段上“长按”来进入编辑模式。由于某些原因,大纲视图有时会Return
键事件进行不同的处理。
我捕获了两个堆栈跟踪:
#1按预期工作:
您可以从Return
中看到,该事件最终使单元格的文本字段成为第一响应者。
#2哔哔声
我在keyDown()
处设置了一个断点,您可以看到这次密钥甚至采用了不同的路径。
我怀疑大纲视图或基础NSBeep
的内部状态是否混杂在一起...
如何从这里解决此问题?大纲视图需要采取哪些步骤来确定按下Return键后是否可以编辑一行?
更新
我做了更多的调试(感谢@Willeke提供有关断点的提示)。我设法解决了这个问题:
- 按下返回键
-
NSTableView
- ...
-
NSOutlineView.keydown
- 概述视图检查选择了哪一行
-
NSOutlineView.selectedRow
- 概述视图检索选定的行视图
-
NSOutlineView.rowView(atRow row: Int,makeIfNecessary: Bool)
- 要求当前行视图作为下一个有效键视图
-
NSTableRowView.nextValidKeyView
- 现在,此操作有时会返回
NSTableRowView.nextKeyView
,并且应用会发出哔哔声。在大多数情况下,它会返回包含nil
的那一行的NSTableCellView
,然后该行将成为第一响应者,因此是可编辑的。
- 现在,此操作有时会返回
现在的问题是,为什么下一个关键视图NSTextField
有时是为什么?我单击大纲视图的行,因此它确实具有焦点/已选中...