【发布时间】:2014-03-17 13:24:53
【问题描述】:
我很难接受这个。当谈到基于视图的 NSOutlineView 的对象持久性时,我遇到了一个非常奇怪的行为。目前我有一个对象,其中包含一个object1数组,该数组包含一个object2数组,该数组包含一个object3数组,等等......每个类(对象)都有一个isEqual:方法和一个isEqualToObject:方法。我一遍又一遍地修改了这些,它们工作得很好。
现在当我展开一个项目时,它被保存到默认 plist 并且我已经检查过,保存的项目数是正确的。
但是当我再次打开我的文档时会发生什么;有时所有行都完全按照我离开时的方式展开,有时没有任何行展开,有时 NSOutlineView 会展开一些行,但不会展开其他行。
请注意,我没有使用 NSTreeController。我正在使用 NSOutlineView 数据源和委托。以下方法是这样实现的。还设置了大纲视图的 AutoSave 名称。
- (id)outlineView:(NSOutlineView *)outlineView persistentObjectForItem:(id)item {
return [NSKeyedArchiver archivedDataWithRootObject:item];
}
- (id)outlineView:(NSOutlineView *)outlineView itemForPersistentObject:(id)object {
return [NSKeyedUnarchiver unarchiveObjectWithData:object];
}
基本上有时它会起作用,有时它会起作用,有时根本不起作用。这是非常随机的。
奇怪的是,我放置了 NSLog 并且每个项目都在寻找匹配项,但是......大纲视图没有扩展它。
【问题讨论】:
-
我认为您应该使用
[item representedObject]来获取底层对象,也就是您的模型中的对象。 -
此外,在检查我的代码时,我发现我调用了我的文档类
[self.groupView setAutosaveExpandedItems:YES];的awakeFromNib。我记得读过你必须手动调用它。我假设您还设置了自动保存名称? -
我已经设置了自动保存名称。 [项目代表对象] 仅在我使用未使用的 NSTreeController 时才有效。
标签: cocoa nsoutlineview