使用Cocoa绑定和NSArrayController观察模型变化

使用Cocoa绑定和NSArrayController观察模型变化,cocoa,cocoa-bindings,key-value-observing,nsarraycontroller,Cocoa,Cocoa Bindings,Key Value Observing,Nsarraycontroller,我有一个NSArrayController绑定到我的控制器中的可变数组,它管理我的模型对象数组。阵列控制器已绑定到我的UI。它工作得很好 现在,我试图手动观察控制器类中模型中的值何时更改(基本上,我将更改的模型标记为“needsToSave”以备以后使用,但当它更改时,我还有一些其他任务) 我已经阅读了KVO,但我不完全确定我需要观察什么。。。NSArrayController?对象数组?每个模型对象本身?混乱 任何指针都会非常有用。提前谢谢 在模型项添加和删除方法中,您应该开始和停止观察每个项

我有一个
NSArrayController
绑定到我的控制器中的可变数组,它管理我的模型对象数组。阵列控制器已绑定到我的UI。它工作得很好

现在,我试图手动观察控制器类中模型中的值何时更改(基本上,我将更改的模型标记为“needsToSave”以备以后使用,但当它更改时,我还有一些其他任务)

我已经阅读了KVO,但我不完全确定我需要观察什么。。。NSArrayController?对象数组?每个模型对象本身?混乱


任何指针都会非常有用。提前谢谢

在模型项添加和删除方法中,您应该开始和停止观察每个项,以便了解发生的一切。这也将帮助您实现撤消。如果你需要示例代码,我知道Hillegass的书中有介绍(至少第二版有,已经查过第三版了)。您还可以查找实现撤销的示例代码以获取帮助。

因此,在我的控制器中,我有如下内容:
-addNewObject{MyObj*obj=…;[obj addObsever:self…];[myArrayController addObject:obj]
像这样?这基本上是正确的,您确实需要开始观察您要使用的每个关键路径
addObserver:self forKeyPath:aKeyPath options:NSKeyValueObservingOptionOld context:NULL
。因为您可能需要观察多个关键路径,所以您可能需要启动和停止观察方法。请不要忘记是否有(您应该)一个setArray:方法,用于逐个枚举所有项,以停止观察旧的数组项,并开始观察新的数组项。顺便说一句,如果您是基于文档的,您可以检查文档是否脏,以保存在“needsToSave”部分。