我希望这是一个足够普遍的问题,一个相当广泛的问题可能有一个明显的答案。为什么我的NSTableView
- 在应用程序加载后 - 有时会填充来自其连接的(核心数据)数据源的数据,有时候是空的。它似乎是随机的。退出和开始之间没有其他任何变化。
帮助:
NSTableView
数据源是一个NSArrayController
,其managedObjectContext
绑定到实体核心数据模型。NSTableView
和NSArrayController
都正确连接到出口和绑定。调试已经成功地用于我所考虑的任何测试,并且它随机工作的事实表明某些东西正在发挥作用。NSArrayController
在其他所有加载完成之前没有及时获取数据。我尝试在NSTableView
完成加载后询问reloadData
到NSArrayController
来纠正这个问题: [jobsController addObserver:self forKeyPath:@"arrangedObjects.jobTitle" options:0 context:nil];
和
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if (object == jobsController)
{
NSLog(@"jobsController finished loading");
[tableView reloadData];
}
}
我还使用了一个单独的测试按钮进行测试,该按钮在我点击它时触发了reloadData
NSTableView
。这没有效果。对缺乏代码表示歉意。该项目相当大,很难将代码与此问题隔离开来。我希望这个问题足够普遍,答案可能是从类似的经验中确定的。
<小时/> 的更新
我非常有信心这与NSArrayController
没有准备好(因为arrangedObjects
的日志在表格没有填充时显示空集,反之亦然一样)。为了扩展我的设置,我还有两个NSArrayController
s(总共3个)。填充NSTableView
的控制器是一个控制器的子控制器,它是另一个控制器的子控制器。我有一个理论,表只有在NSArrayControllers的加载顺序是(巧合)parent&gt;时才会填充。父母&gt;父级,因为每个孩子的内容集依赖于其父NSArrayController
。也许我的解决方案是手动选择控制器的加载顺序?
答案 0 :(得分:2)
在tableview的awakeFromNib方法中,调用数组控制器的fetch方法。这将使用所需的数据填充数组控制器,以便您调用reloadData实际上有要加载的数据。
答案 1 :(得分:0)
我找到了答案,并认为这种情况对其他人来说可能是可重复的,所以希望这对他们有用。我将NSArrayController
的“内容集”设置为其父NSArrayController
反向关系。当我想用仅包含父数组的选定信息填充子数组时,这在项目的早期就有意义了。
在这种情况下,不再需要此功能,因此我忘记了它的行为方式。因此,当应用程序启动时,它(似乎)在顶部NSArrayController
中随机选择一个对象,并使用仅与其所选父项相关的对象填充其子NSArrayController
。如果其中任何一个为空,则会导致没有任何对象过滤到填充NSTableView的子NSArrayController
,并解释为什么它似乎随机填充它的感觉。