NSTreeController不响应reloadData

时间:2011-09-15 03:23:54

标签: cocoa nstreecontroller

我有一个绑定到类的NSTreeController。

NSOutlineView dirTree绑定到NSTreeController

特别是大纲视图内容绑定到arrangeObjects

这似乎运作良好,但我最终知道为什么它不响应reloadData。

NSTreeController 关键路径是: -

Children    subDirectories
Count       numberOfSubDirs

如下所列; numberOfSubDirs返回子目录的简单计数(添加了诊断显示)。

- (NSArray *)subDirectories {
    if (subDirectories == nil) {
        [self loadSubDirectories];
    }
    return subDirectories;
}

- (NSInteger)numberOfSubDirs {
    NSArray *tmp = [self subDirectories];
    NSLog(@"numberOfSubDirs %@ %d", [self relativePath], [tmp count]);
    return [tmp count];
}

如果我调用刷新函数来更新数据,则调用[dirTree reloadData];我得到以下输出: -

Reload Data
numberOfSubDirs Shared 7
numberOfSubDirs Adobe 1
numberOfSubDirs bZTree2 0
numberOfSubDirs Ian Documents 25
numberOfSubDirs Library 1
numberOfSubDirs NET 1
numberOfSubDirs TSA 12
numberOfSubDirs Wacom 1

如果我删除目录(在Finder外部)并调用刷新功能,我会得到以下输出: -

Reload Data
numberOfSubDirs Shared 6
numberOfSubDirs Adobe 1
numberOfSubDirs bZTree2 0
numberOfSubDirs Ian Documents 25
numberOfSubDirs Library 1
numberOfSubDirs NET 1
numberOfSubDirs TSA 12
numberOfSubDirs Wacom 1

NSTreeController在父“Shared”上调用numberOfSubDirs,并且正确地告诉它现在有6个子目录。

然而,它会查询7个子目录,包括已删除的项目“bZTree2”,并且不刷新显示以仅显示存在的6个。

1 个答案:

答案 0 :(得分:1)

NSTreeController不响应-reloadData,因为它没有实现该方法。如果您尝试在NSTreeController实例上调用它,则会收到运行时异常和编译器警告。

NSOutlineView回复-reloadData,但除非NSOutlineView使用数据源,否则它不会执行任何操作。如果您使用的是NSTreeController,则根本不会执行任何操作。

由于您似乎在创建文件系统视图,我强烈建议您通过数据源路由而不是使用NSTreeController,这样可以省去很多麻烦。

Apple也有documentationsample code这样做。