如何遍历我的 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 与多个核心数据实体作为组一起使用
如何检查数组的至少一项是不是包含在对象数组中并遍历所有对象(JS)