gpt4 book ai didi

cocoa - 如何在启动时设置 NSTreeController 的默认选择?

转载 作者:行者123 更新时间:2023-12-03 18:05:31 25 4
gpt4 key购买 nike

背景

我在我的 Cocoa 应用程序中构建了一个源列表(类似于 iTunes 等)。

  • 我有一个带有 Value 的 NSOutlineView绑定(bind)到arrangedObjects.name的列NSTreeController 的关键路径。

  • NSTreeController 访问Core 中的 JGSourceListNode 实体数据存储。

  • 我有三个子类JGSourceListNode - JGProjectNode,JGGroupNode 和 JGFolderNode。

  • 我已将 NSTreeController 上的 selectedIndexPaths 绑定(bind)到我的应用程序委托(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];
}

我想要什么

当我启动应用程序时,我希望展开两个顶级组并突出显示“未训练”,如下所示:

My Window http://synapticmishap.co.uk/Window.jpeg

问题

我将以下代码放入应用程序委托(delegate)的 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]];

但是大纲 View 似乎还没有准备好,所以这段代码什么也不做。

理想情况下,最终我想保存用户所做的最后选择并在重新启动时恢复它。

问题

我确信可以使用一些疯狂的 KVO 来观察 NSTreeController 或 NSOutlineView 何时被填充,然后展开项目并更改选择,但这感觉很笨拙,太像一种变通办法。

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

最佳答案

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

lastSelectedRow = [outlineView selectedRow]

然后在应用程序启动时,我在应用程序中运行此命令并完成启动:

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

请注意,我只是使用了延迟,因为我注意到与您相同的“大纲 View 似乎尚未准备好”。然后在该选择器中我使用它。

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

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

关于cocoa - 如何在启动时设置 NSTreeController 的默认选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2709625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com