NSOutlineView和对象持久性奇怪行为

时间:2014-02-18 01:44:35

标签: cocoa nsoutlineview

我很难过。当涉及到基于NSOutlineView的视图的对象持久性时,我得到了一个非常奇怪的行为。目前我有一个对象,其中包含一个object1数组,其中包含一个object2数组,其中包含一个object3等数组...每个类(对象)都有一个isEqual:方法和一个isEqualToObject:方法。我一遍又一遍地修改这些,它们工作正常。

现在,当我展开一个项目时,它会保存到默认值plist并且我已经检查过它,保存的项目数是正确的。

但是当我再次打开我的文件时会发生什么?有时所有的行都会在我离开时完全展开,有时没有任何行被展开,有时NSOutlineView会展开一些行但不会展开其他行。

注意我没有使用NSTreeController。我正在使用NSOutlineView DataSource和Delegate。以下方法是这样实现的。此外,还设置了大纲视图的AutoSave名称。

- (id)outlineView:(NSOutlineView *)outlineView persistentObjectForItem:(id)item {
        return [NSKeyedArchiver archivedDataWithRootObject:item];
    }

- (id)outlineView:(NSOutlineView *)outlineView itemForPersistentObject:(id)object {
        return [NSKeyedUnarchiver unarchiveObjectWithData:object];

}

基本上有时它起作用,有时它起作用,有时甚至根本不起作用。这是非常随机的。

奇怪的是我放置了NSLog并且每个项目都找到了匹配但是...大纲视图没有扩展它。

1 个答案:

答案 0 :(得分:1)

我得到了它的工作。所以我最终做的是搜索我拥有的每个数组对象并返回匹配对象(不是persistentObject,而是已经是我数据的一部分的对象)。换句话说

- (id)outlineView:(NSOutlineView *)outlineView itemForPersistentObject:(id)object {

    id persistentObject =[NSKeyedUnarchiver unarchiveObjectWithData:object];

    for (Class * a in dataArray) {
        if ([a isEqual:persistentObject]) {
            return a;  //instead of returning persistentObject
        }
    }
}

这就是诀窍。我为此搜索了很长时间,我希望有人觉得它很有用。