如何遍历我的 NSOutlineView 的所有项目?

Posted

技术标签:

【中文标题】如何遍历我的 NSOutlineView 的所有项目?【英文标题】:How can I iterate through all items of my NSOutlineView? 【发布时间】:2012-04-03 10:55:09 【问题描述】:

当我关闭窗口时,我需要对 NSOutlineView 中的所有对象执行操作。

(父母和孩子,以及孩子的孩子)。 项目是否展开无关紧要,我只需要对大纲视图中的所有项目执行选择器即可。

谢谢

【问题讨论】:

【参考方案1】:

假设您使用的是 NSOutlineViewDataSource 而不是绑定,您可以这样做:

- (void)iterateItemsInOutlineView: (NSOutlineView*)outlineView

    id<NSOutlineViewDataSource> dataSource = outlineView.dataSource;
    NSMutableArray* stack = [NSMutableArray array];
    do
    
        // Pop an item off the stack
        id currentItem = stack.lastObject;
        if (stack.count) 
            [stack removeLastObject];

        // Push the children onto the stack
        const NSUInteger childCount = [dataSource outlineView: outlineView numberOfChildrenOfItem: currentItem];
        for (NSUInteger i = 0; i < childCount; ++i) 
            [stack addObject: [dataSource  outlineView: outlineView child: i ofItem: currentItem]];

        // Visit the current item.
        if (nil != currentItem)
        
            // Do whatever you want to do to each item here...
                
     while (stack.count);

这应该实现对您的NSOutlineViewDataSource出售的所有对象的完全遍历。

仅供参考:如果您使用的是可可绑定,这将无法正常工作。但是,如果是这种情况,您可以对您绑定到的 NSTreeController(或其他任何东西)使用类似的方法(即代理堆栈遍历)。

HTH

【讨论】:

由于某种原因这对我不起作用。这给了我堆栈上的 0 个对象。我没有使用绑定。 这里的代码并不是要将所有的项目都放入stack,只是为了访问每一个项目。 stack 开头和结尾都是空的。 我发现必须选择一项才能使此方法起作用。因为这个想法是遍历所有项目,所以我首先选择项目 0,然后运行您的方法。谢谢

以上是关于如何遍历我的 NSOutlineView 的所有项目?的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地展平 NSOutlineView?

如何将 NSOutlineView 与多个核心数据实体作为组一起使用

从 NSOutlineView 中拖放

如何检查数组的至少一项是不是包含在对象数组中并遍历所有对象(JS)

NSTableView 和 NSOutlineView 在 tab 键上编辑

NSOutlineView -- reloadItem:reloadChildren: 让我的应用程序崩溃