当项目更改时,CoreData 绑定的 NSTableView 会失去输入焦点,但前提是已排序

Posted

技术标签:

【中文标题】当项目更改时,CoreData 绑定的 NSTableView 会失去输入焦点,但前提是已排序【英文标题】:CoreData-bound NSTableView loses input focus when items change, but only if sorted 【发布时间】:2011-02-07 16:45:17 【问题描述】:

我在对话框中有一个 NSTableView,它通过“实体名称”模式下的 NSArrayController 绑定到 CoreData 模型实例的集合。该表在单个列中显示托管对象数组的names。这很好用。

表格行中的名称是可编辑的。如果用户在没有对表格应用排序的情况下编辑名称,则编辑会正常进行。按下 Return 后,新名称被记录下来,输入焦点停留在 NSTableView 中。但是,如果单击表视图中的列标题以对名称表进行排序,则输入焦点在编辑后会误入歧途。它停留在窗口内,或者更广阔的视野(不确定是哪个),但它离开了桌子;聚焦环消失,突出显示的项目的背景颜色从蓝色变为灰色。按 T​​ab 会将输入焦点再次弹出到表格视图中。

在表格内容已排序时发生。如果为绑定选择了“持续更新值”,那么在输入任何字符的那一刻,表格视图似乎想要重新排序(没关系)并且焦点跳出它(这对用户来说不合适)正在尝试输入内容)。

就系统的这一方面而言,没有代码——这一切都是通过在 Interface Builder 中建立的绑定完成的。大概是我无意中设置或清除了一些我不应该拥有的选项。

如果它可以帮助读者弄清楚发生了什么 - 我还有一个模式表附加到包含 NSTableView 的对话框中。该工作表用于编辑在表格视图中选择的项目的详细信息。这里的控件也使用与工作表“后面”对话框相同的 NSArrayController 与 CoreData 模型的绑定连接。出现了同样的问题 - 一旦输入新名称,焦点就会被拉回到模式表“后面”的对话框。

唯一涉及的代码是用于处理“编辑此项目”操作并启动工作表的模式会话的代码。

发生了什么事?焦点在哪里,为什么仅仅因为在 NSTableView 中重新排序而被移动?

谢谢!

【问题讨论】:

【参考方案1】:

实体 NSArrayController 在相关的 Interface Builder 检查器面板中勾选了“Auto Rearrange Content”。这并没有做我认为它会做的事情,并且是导致焦点窃取问题的原因。

我最终通过创建一个简单的 CoreData 应用程序来缩小范围,该应用程序只是将名称添加到表视图中。几乎不需要代码; 99.5% 的 Interface Builder 和绑定,只有一个额外的出口和一行胶水代码来告诉 CoreData 模型的数组控制器有关由 Interface Builder 自动生成的代码在应用程序委托中实例化的托管对象上下文。在测试程序中设置“自动重新排列内容”标志会引发同样奇怪的输入焦点行为。

因此,如果您在通过数组控制器绑定到 CoreData 的对象表中遇到焦点窃取问题,请检查您的数组控制器的自动重新排列标志!

【讨论】:

如果您正在寻找一种解决方案来保持自动重新排列功能并且仍然没有失去焦点,请查看@KenThomases ***.com/a/25352856/2012262的这个答案 太好了,谢谢。虽然我的问题很老,但学习新技巧总是有用的。

以上是关于当项目更改时,CoreData 绑定的 NSTableView 会失去输入焦点,但前提是已排序的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式绑定一个 NSTableView

如何自动选择插入到 NSOutlineView & Core Data 中的项目

CoreData:仅当项目所有子项目都被删除时,级联删除规则

当 DataSource 值更改时,WinForms ComboBox 中的项目不会更新

当用户更改全局对象时重新初始化合并发布者

更改 App 当前的 CoreData 源