我在对话框中有一个NSTableView,它通过“实体名称”模式下的NSArrayController绑定到CoreData模型实例的集合。该表显示单个列中托管对象数组的name
。这很有效。
表格行中的名称是可编辑的。如果用户在没有应用于表的排序时编辑名称,则编辑正常进行。按Return键后,将记录新名称,输入焦点将保留在NSTableView中。但是,如果单击表视图中的列标题以对名称表进行排序,则输入焦点在编辑后将误入歧途。它停留在窗口或更宽的视野内(不确定是哪个),但是它会离开桌子;聚焦环消失,突出显示项目的背景颜色从蓝色变为灰色。按Tab键将输入焦点再次弹回到表格视图中。
如果对表内容进行排序,则会发生仅。如果为绑定选择了“Continuously Updates Value”,那么随着输入任何字符的分钟,这是灾难性的,表格视图似乎想要重新排序(没关系)并且焦点跳出它(这对用户来说不是很好)正在尝试输入内容。)
就系统的这个方面而言,没有代码 - 所有这些都是在Interface Builder中建立的绑定完成的。据推测,我无意中设定或清除了一些我不应该拥有的选项。
如果它有助于读者弄清楚是什么 - 我还在包含NSTableView的对话框中附加了一个模态表。该工作表用于编辑在表视图中选择的项目的详细信息。其中的控件还使用与工作表“后面”对话框相同的NSArrayController与CoreData模型的绑定相关联。同样的问题就出现了 - 只要输入新名称,焦点就会被拉回模态表后面的对话框。
唯一涉及的代码是用于处理“编辑此项目”操作并启动工作表的模态会话。
发生了什么事?焦点在哪里以及为什么因为在NSTableView中重新排序而被移动?
谢谢!
答案 0 :(得分:6)
实体NSArrayController在相关的Interface Builder检查器面板中勾选了“自动重新排列内容”。这不是我认为它会做的事情,也是焦点窃取问题的原因。
我最终通过创建一个简单的CoreData应用程序来缩小范围,该应用程序只是在表视图中添加了名称。几乎不需要代码; 99.5%的Interface Builder和绑定,只有一个额外的插座和一行胶水代码,告诉阵列控制器CoreData模型关于通过Interface Builder自动生成的代码在应用程序委托中实例化的托管对象上下文。在测试程序中设置“Auto Rearrange Content”标志会引发相同的奇怪输入焦点行为。
因此,如果您通过阵列控制器通过绑定到CoreData的对象表来解决问题,请检查阵列控制器的自动重新排列标志!