的背景
我在我的 Cocoa 应用程序中建立了一个源列表(类似于 iTunes 等)。
我有一个 NSOutlineView,其 Value 列绑定到 NSTreeController 的排列对象.name 键路径。
NSTreeController 访问核心数据存储中的 JGSourceListNode 实体。
我有 JGSourceListNode 的三个子类 - JGProjectNode、JGGroupNode 和 JGFolderNode。
我已将 NSTreeController 上的 selectedIndexPaths 绑定到我的 App Delegate 中名为 selectedIndexPaths 的 NSArray。
在启动时,我搜索组节点,如果在核心数据存储中找不到它们,我会创建它们:
if ([allGroupNodes count] == 0) {
JGGroupNode *rootTrainingNode = [JGGroupNode insertInManagedObjectContext:context];
[rootTrainingNode setNodeName:@"TRAIN"];
JGProjectNode *childUntrainedNode = [JGProjectNode insertInManagedObjectContext:context];
[childUntrainedNode setParent:rootTrainingNode];
[childUntrainedNode setNodeName:@"Untrained"];
JGGroupNode *rootBrowsingNode = [JGGroupNode insertInManagedObjectContext:context];
[rootBrowsingNode setNodeName:@"BROWSE"];
JGFolderNode *childFolder = [JGFolderNode insertInManagedObjectContext:context];
[childFolder setNodeName:@"Folder"];
[childFolder setParent:rootBrowsingNode];
[context save:nil];
}
我想要的是
当我启动应用程序时,我希望扩展两个顶级组并突出显示“未训练”,如下所示:
我的窗口 http://synapticmishap.co.uk/Window.jpeg
问题
我将以下代码放在applicationDidFinishLaunching:
应用程序委托的方法中:
[sourceListOutlineView expandItem:[sourceListOutlineView itemAtRow:0]];
[sourceListOutlineView expandItem:[sourceListOutlineView itemAtRow:2]];
NSIndexPath *rootIndexPath = [NSIndexPath indexPathWithIndex:0];
NSIndexPath *childIndexPath = [rootIndexPath indexPathByAddingIndex:0];
[self setSelectedIndexPaths:[NSArray arrayWithObject:childIndexPath]];
但是大纲视图似乎还没有准备好,所以这段代码什么也不做。
理想情况下,最终我想保存用户所做的最后选择并在重新启动时恢复它。
问题
我确信可以使用一些疯狂的 KVO 来观察 NSTreeController 或 NSOutlineView 何时被填充,然后展开项目并更改选择,但这感觉很笨拙,太像一个解决方法。
我将如何优雅地做到这一点?