Objective-C撤消经理问题
|
我正在阅读有关Objective-c的书,并了解撤消管理器。这个概念看起来很简单,但是提供的示例似乎过于复杂。基本上,我有一个连接到NSArrayController的表视图,并且可以将人添加或删除到数组中,并且可以编辑其名称和内容。由于该示例使用NSArrayController和绑定,因此添加和删除是自动的,所有编辑都是自动的。
根据我的理解,要使用撤消管理器,我需要实现自己的方法来添加/删除/编辑。
由于键值编码,我已经实现了以下方法来执行添加和删除操作并自动调用它们:
- (void)removeObjectFromEmployeesAtIndex:(int)index;
- (void)insertObject:(Person *)p inEmployeesAtIndex:(int)index;
然后为了进行编辑,我不得不将类注册为观察者,并观察更改以进行编辑:
- (void)changeKeyPath:(NSString *)keyPath
ofObject:(id)obj
toValue:(id)newValue
这是我的问题:
我为什么要做那么多?我的理解是,使用NSArrayController和绑定应该使诸如添加/删除/编辑项目之类的事情变得更加容易和自动化。但是,如果无论如何我都必须手动实现所有这些方法以添加撤消支持,为什么还要使用NSArrayController或绑定呢?
幕后发生了什么?在Interface Builder中,添加按钮连接到NSArrayController上的add方法。然后如何调用我的insertObject方法?我知道这是通过键值编码实现的,但是是什么使NSArrayController的add方法仅在我的文档实现此方法的情况下被覆盖?
解决方案是不对称的。我使用一个概念来处理撤消添加/删除操作,而使用另一个概念来处理撤消编辑操作。我也不能只观察阵列的变化吗?我想它将使observeValueForKeyPath方法变得复杂,但这更有意义吗?
没有找到相关结果
已邀请:
1 个回复
糕泰灌
或
时,符合KVC的对象将返回一个代理数组或设置一个代理数组,这会将这些方法公开为数组。大致上,这就是NSArrayController知道要调用的方式-KVC在数组的原始对象与一些从键生成鬃毛的方法之间进行映射。由于您不想使用数组作为数据对象,因此将任何多对多关系视为普通集合通常非常有用。 3)我认为这与您在错误的位置处理撤消有关。实现KVC兼容方法以获取/设置数据对象中的属性,让它们在设置数据的同时更新undoManger。您将需要一种特殊的方法来使Undomanager还原更改,因为您不希望撤消记录为可撤消记录。或者,您可以只使用Core Data并免费获得所有这些东西...