【问题标题】:Expanding all items of a NSOutlineView that loads data from a data source展开从数据源加载数据的 NSOutlineView 的所有项
【发布时间】:2010-04-13 16:14:09
【问题描述】:

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

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

我查看了NSOutlineViewDelegate 协议,但找不到适合此呼叫的位置。解决这个问题的最佳方法是什么?

【问题讨论】:

    标签: cocoa macos nsoutlineview


    【解决方案1】:

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

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

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

    【讨论】:

    • 不知道为什么这被否决了。当我能找到的其他解决方案失败时,这对我有用。谢谢!
    • 最佳答案! :) 无论上下文如何,这个都有效。
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您建议使用windowDidLoad:这似乎是进行此类设置的好地方。但是,顺便说一句,我发现我不需要使用延迟,至少对于我正在尝试做的事情:我直接从windowDidLoad 调用-expandItem:,到目前为止,这似乎工作。可能是由于以下原因之一:我在 10.9.3;我只是扩展某些行,所以我将特定项目提供给 -expandItem: 而不是 nil...?
    【解决方案3】:

    我找到了答案。似乎实现了委托方法-(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];
    }
    

    【讨论】:

    • 稍后编辑:这不是一个好的答案,它似乎搞砸了大纲视图中的最后一项并且没有显示它们,因此我们将不胜感激
    【解决方案4】:

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

    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification

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

    【讨论】:

    • 谢谢,但这对我来说不是一个解决方案,因为大纲视图位于用户单击按钮时打开的面板中,并且数据似乎在显示面板时加载,而不是在应用程序启动
    猜你喜欢
    • 2011-09-22
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 2019-08-17
    • 2021-01-15
    相关资源
    最近更新 更多