2011-06-15 70 views
6

我的NSObject的子类有70个性质,我需要观察在所有这些变化不会增加使用下面的每个属性一个接一个:如何NSObject的性质观察变化

[self addObserver: self 
     forKeyPath: @"propertyname" 
      options: NSKeyValueObservingOptionNew 
      context: NULL]; 

。请让我知道最简单的方法来做到这一点。现在,我需要10.5和更高版本的解决方案。

回答

10

您可以使用Objective-C运行时函数class_copyPropertyList()来获取该类的所有属性,然后遍历该列表并使用property_getName()获取应该与关键值观察一起工作的内容。

或者您可以在相关课程上实施keyPathsForValuesAffectingValueForKey:。在课堂上制作一个新的关键,我们只会用于变化检测。然后实现上面的方法,如果传入的字符串等于你的新密钥,则返回一个包含所有七十个属性名称的集合。然后你可以在你的新密钥上做KVO,当有任何改变时你会得到通知。这样做,你不会知道哪个属性发生了变化,只是其中一个属性发生了变化。

它可能有助于告诉我们为什么你需要这样做,因为可能有更好的设计模式可供使用。

+0

感谢您的宝贵答案。我的类属性直接绑定到XIB中的几个UI控件。我需要允许用户检测当前UI控件中的更改,并通知用户保存更改,如果他们关闭Main XIB而不保存当前值。我会尽力按照您提及的方式执行,并会告诉我这是否适合我。 – AmitSri 2011-06-15 09:00:35

+0

鉴于这个用例,我真的希望有一个更好的方法来做到这一点。我一直在阅读NSObjectController以防万一你想要什么,但是我不能找到你没有使用Core Data的情况的很多信息。我没有尝试过,但它看起来像一个想法:做一个NSObjectController子类,在IB中实例化,并将其内容对象设置为您的NSObject。将所有UI绑定到NSObjectController,并使用相同的键。然后,在代码中,重写控制器子类上的'objectDidEndEditing:',并且在任何类应该保存的地方调用一个方法。 – 2011-06-15 09:41:09

+0

感谢您的建议,我会看看我是否可以按照您的建议改变我的实施。目前,我已经按照你的建议实现了keyPathsForValuesAffectingValueForKey,它现在似乎适用于我。 – AmitSri 2011-06-16 04:43:23