【发布时间】:2011-06-12 16:57:52
【问题描述】:
我正在阅读一本关于 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 方法复杂化,但这更有意义吗?
【问题讨论】:
-
你在使用 Core Data 吗?
-
不,我还没听说过
-
在 Core Data 之前学习这一点可以减轻痛苦;那样会更有意义。我可以提供的一点建议是,您会在 Cocoa/Xcode 中找到使用起来非常方便的东西,但通常您必须解决问题。一个具体的例子是使用 IB 来创建 GUI - 做复杂的事情它可能变得无用(对于动画等),你必须进入幕后(IB 在这方面进行了改进,就像 CoreData 为你的问题所做的那样)。似乎您现在已经看到了其中一种情况。我的观点:如果你觉得你正在以艰难的方式做某事,它可能仍然是最好/正确的方式。祝你好运
-
@Nektarios “如果你觉得你正在以艰难的方式做某事,它可能仍然是最好/正确的方式”是一个很好的观点。除此之外,您需要很好地了解绑定和 kvo/kvc,以便了解核心数据在做什么并处理边缘情况。自己编写这类东西可能是一个很好的方法。
标签: objective-c cocoa key-value-observing nsarraycontroller key-value-coding