NSArrayController添加功能致NSTableView已有条目临时失焦求助
问题描述
我有几款基于Core Data开发、长期稳定运行的应用,最初在搭载OS X 10.13.6系统的旧版Xcode环境中构建。我自定义了NSArrayController的add方法,会自动为新对象插入当前日期,同时让相邻的第二列单元格获得焦点环并准备好输入。
多年来一切正常,但在运行Ventura 13.6.3系统的新设备上运行应用时,触发add功能后,NSTableView中所有已保存/列出的条目都会临时失焦、呈现灰色状态,需点击条目或通过键盘滚动才能恢复焦点。
若将[mWindow makeFirstResponder:table1]移至代码块末尾,触发add时已有数据可保留焦点,但会失去预期的日期列相邻单元格的焦点环,此时新增条目整行被选中,不符合需求。
相关代码如下:
[mWindow makeFirstResponder:table1]; id newObject = [BatchController newObject]; [BatchController insertObject:newObject atArrangedObjectIndex:0]; [newObject setValue:[NSDate date] forKey:@"date"]; [table1 editColumn:1 row:0 withEvent:nil select:YES]; [search setStringValue: @""]; [BatchController setFilterPredicate: nil];
问题现象:新增条目后,原有列表条目呈灰色失焦状态,仅新增条目可编辑,但其他条目需手动操作才能恢复正常显示状态。
解决方案
问题根源是macOS Ventura之后,NSTableView的焦点管理和响应链处理逻辑发生了变化,直接设置firstResponder的时机和方式需要调整。可以通过以下步骤修复:
- 先完成数据插入和日期设置,再处理表格的焦点和编辑状态
- 避免过早将表格设为firstResponder,而是通过
editColumn:row:withEvent:select:主动触发编辑,同时确保表格的选中状态正确
调整后的代码:
// 先插入新对象并设置日期 id newObject = [BatchController newObject]; [BatchController insertObject:newObject atArrangedObjectIndex:0]; [newObject setValue:[NSDate date] forKey:@"date"]; // 清空搜索和过滤,避免数据变化干扰焦点 [search setStringValue: @""]; [BatchController setFilterPredicate: nil]; // 确保表格处于有效窗口上下文,再处理焦点与编辑 if ([table1 window] != nil) { [[table1 window] makeFirstResponder:table1]; [table1 editColumn:1 row:0 withEvent:nil select:YES]; }
关键调整说明:
- 数据操作优先:将插入对象、设置日期、清空搜索等数据相关操作放在焦点处理之前,避免数据更新导致表格焦点状态被意外重置
- 上下文校验:增加表格窗口存在的判断,确保
makeFirstResponder调用时的上下文有效 - 时序优化:把
makeFirstResponder和editColumn:...的调用放在数据稳定后,让表格完成界面刷新再处理焦点,避免原有条目因数据与焦点切换冲突而失灰
如果上述调整仍有问题,可以尝试延迟触发编辑操作,给表格足够时间完成数据同步和界面刷新:
// 数据操作完成后,延迟触发编辑 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [[table1 window] makeFirstResponder:table1]; [table1 editColumn:1 row:0 withEvent:nil select:YES]; });
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

