cocoa - NSOutlineView:有时一行是不可编辑的(只是哔哔声)
问题描述
我有一个基于视图的数据源NSOutlineView
和委托配置。它由两列自定义NSTableCellView
类组成。
大纲视图中的条目可通过选择一行并按Return
键进行编辑。一切都是根据文档设置的,并且大部分时间都可以正常工作。
但是,有时当我Return
在选择一行时按下,单元格的文本字段不会进入编辑模式。它只是发出哔哔声。
我仍然可以通过“长按”文本字段进入编辑模式。出于某种原因,Return
大纲视图有时会以不同的方式处理关键事件。
我捕获了两个堆栈跟踪:
#1 按预期工作:
您可以从keyDown()
事件中看到最终使单元格的文本字段成为第一响应者。
#2 哔哔声
我在 处设置了一个断点,NSBeep
您可以看到这次密钥甚至采用了不同的路径。
我怀疑可能是大纲视图或底层的内部状态NSTableView
混淆了......
我怎样才能从这里解决这个问题?大纲视图采取哪些步骤来确定按下 Return 键后是否可以编辑行?
更新
我做了更多调试(感谢@Willeke 提供有关断点的提示)。我设法解决了这个问题:
- 返回键被按下
NSOutlineView.keydown
- ...
NSOutlineView.selectedRow
- 大纲视图检查选择了哪一行
NSOutlineView.rowView(atRow row: Int, makeIfNecessary: Bool)
- 大纲视图检索选定的行视图
NSTableRowView.nextValidKeyView
- 当前行视图被要求提供下一个有效的键视图
NSTableRowView.nextKeyView
- 现在这有时会返回
nil
,应用程序只会发出哔哔声。大多数情况下,它会返回NSTableCellView
包含 的那一行NSTextField
,然后将其设为第一响应者,因此可编辑。
- 现在这有时会返回
现在的问题是为什么nil
有时是下一个关键视图?我单击大纲视图的行,因此它确实具有焦点/被选中...
解决方案
推荐阅读
- python - Python 如何管理相对路径
- c++ - 在 C++ 中反转字符串(使用递归)
- python - SQLite3 中简单选择查询(使用索引)的性能问题
- scala - 根据值组合两个数据集
- react-native - Android:尝试使用 fetch 上传图像时网络请求失败
- vue.js - 将自定义指令添加到 vuejs 渲染函数中的插槽
- javascript - 如何隐藏已注销用户的内容?
- android - 如何在谷歌地图片段android工作室中导入KML多边形文件
- angular - App module.ts Angular文件中这三行的含义是什么
- c++ - 在 Qt 5.3 版中将 QString 转换为 QChar