首先,我是可可开发的新手,所以我想我可能试图以错误的方式做到这一点,但是这里有:
我有一个NSOutlineView
来加载来自NSOutlineViewDataSource
实现的数据。我希望所有项目在加载后都能展开,但是在数据加载完成后我似乎无法找到一个事件,所以我可以向它发送一个[outlineView expandItem: nil expandChildren: YES]
。
我查看了NSOutlineViewDelegate
协议,但我无法找到合适的地方进行此次通话。这个问题的最佳方法是什么?
答案 0 :(得分:8)
通常我喜欢在表单中执行类似的操作 - awakeFromNib或任何其他启动回调
dispatch_async(dispatch_get_main_queue(), ^{
[self.outlineView expandItem:root expandChildren:YES];
});
这将在runloop中将当前循环结束时的执行块排入队列,因此,它将在所有初始化发生后执行。没有必要设置任何人工延迟。
答案 1 :(得分:3)
我提出的最佳解决方案是编写一个方法,在延迟为零后扩展NSOutlineView
。
- (void)windowDidLoad
{
[super windowDidLoad];
[self performSelector:@selector(expandSourceList) withObject:nil afterDelay:0.0];
}
- (IBAction)expandSourceList
{
[mSourceListView expandItem:nil expandChildren:YES];
}
答案 2 :(得分: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];
}
答案 3 :(得分:1)
以下是我通常如何处理这个问题。我喜欢自己展示我的主窗口,而不是让它自动发生。这允许我在向用户显示窗口之前确保我的所有界面项都是如何设置的。看来你也可以做到这一点。首先,我在窗口的界面构建器中取消选中“在启动时可见”。然后在我的应用程序的委托类中,我使用此方法,这是NSApplication的删除方法:
在那里我设置了我的界面项目,因为那时我知道一切都已加载。然后该方法的最后一行是:[myWindow makeKeyAndOrderFront:self] ;.通过这种方式,您可以在用户看到窗口之前知道您的窗口是完美的。所以我会尝试你的方法。