我很难过。当涉及到基于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并且每个项目都找到了匹配但是...大纲视图没有扩展它。
答案 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
}
}
}
这就是诀窍。我为此搜索了很长时间,我希望有人觉得它很有用。