如何迭代我的NSOutlineView的所有项目?

时间:2012-04-03 10:55:10

标签: objective-c cocoa

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

(父母和孩子以及孩子的孩子)。 如果项目是否展开并不重要,我只需要在大纲视图中对所有项目执行选择。

感谢

1 个答案:

答案 0 :(得分:2)

假设你正在使用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