0

的背景

我在我的 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 何时被填充,然后展开项目并更改选择,但这感觉很笨拙,太像一个解决方法。

我将如何优雅地做到这一点?

4

1 回答 1

1

优雅?这并不优雅,但我就是这样做的。我只是手动完成。在应用程序退出时,我将此值写入用户默认值:

lastSelectedRow = [outlineView selectedRow]

然后在应用程序启动时,我在应用程序中运行它确实完成了启动:

[self performSelector:@selector(selectLastNoteOrCreateDefaultNote) withObject:nil afterDelay:1];

请注意,我只是使用延迟,因为我和您一样注意到“大纲视图似乎还没有准备好”。然后在那个选择器中我使用它。

[outlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:lastSelectedRow] byExtendingSelection:NO];

它有效,但我也欢迎更好(更优雅)的解决方案。

于 2010-04-25T19:59:19.523 回答