5

首先,我是可可开发的新手,所以我想我可能试图以错误的方式做到这一点,但这里是:

我有一个NSOutlineView从实现中加载数据的方法NSOutlineViewDataSource。我希望所有项目在加载后展开,但我似乎找不到在数据加载完成时触发的事件,所以我可以向[outlineView expandItem: nil expandChildren: YES]它发送一个。

我查看了NSOutlineViewDelegate协议,但找不到适合此通话的地点。解决这个问题的最佳方法是什么?

4

4 回答 4

10

通常我喜欢在表单内部做这样的事情 - awakeFromNib 或任何其他启动回调

dispatch_async(dispatch_get_main_queue(), ^{
    [self.outlineView expandItem:root expandChildren:YES];
});

这将在 runloop 中当前循环结束时将执行块排入队列,因此,它将在所有初始化发生后执行。无需设置任何人为延迟。

于 2014-01-14T01:23:59.340 回答
3

我想出的最佳解决方案是编写一个NSOutlineView在延迟为零后扩展的方法。

- (void)windowDidLoad
{
    [super windowDidLoad];
    [self performSelector:@selector(expandSourceList) withObject:nil afterDelay:0.0];
}

- (IBAction)expandSourceList
{
    [mSourceListView expandItem:nil expandChildren:YES];
}
于 2012-03-01T06:30:30.370 回答
2

我找到了答案。似乎实现委托方法-(void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item 可以解决问题:


-(void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item
{
    [outlineView expandItem:item];
}
于 2010-04-14T10:27:33.193 回答
1

这是我通常处理这个问题的方式。我喜欢自己展示我的主窗口,而不是让它自动发生。这使我可以确保在向用户显示窗口之前,我的所有界面项都按照我想要的方式设置。看来你也可以这样做。因此,首先我在窗口的界面构建器中取消选中“启动时可见”。然后在我的应用程序的委托类中,我使用这个方法,它是 NSApplication 的 deleate 方法:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification

在那里我设置了我的界面项目,因为那时我知道所有内容都已加载。然后该方法的最后一行将是:[myWindow makeKeyAndOrderFront:self];。这样你就知道你的窗口在你的用户看到窗口之前是完美的。所以我会在那里尝试你的方法。

于 2010-04-13T18:50:24.773 回答