每當我的對象屬性發生變化或更新時,我想更改一個變量(nonce變量)。這個隨機數是基於時間的。因此,每次更新屬性時,此隨機數都會更新爲當前時間。鍵值觀察:我可以觀察所有屬性的變化嗎?
有什麼辦法可以自動偵聽我物體上的所有關鍵變化嗎?或者我將不得不分別手動維護每個屬性的所有keyvalue觀察者?
非常感謝
每當我的對象屬性發生變化或更新時,我想更改一個變量(nonce變量)。這個隨機數是基於時間的。因此,每次更新屬性時,此隨機數都會更新爲當前時間。鍵值觀察:我可以觀察所有屬性的變化嗎?
有什麼辦法可以自動偵聽我物體上的所有關鍵變化嗎?或者我將不得不分別手動維護每個屬性的所有keyvalue觀察者?
非常感謝
中使用這種技術(排序)你看了一下Obj-C運行時功能嗎?請參閱文檔中的here。例如,這給你一個類Lender
的所有屬性的列表。 (順便說一句:我不是在我的Mac,所以這只是直接從文檔的):
@interface Lender : NSObject {
float alone;
}
@property float alone;
@end
你可以使用得到的屬性列表:
id LenderClass = objc_getClass("Lender");
unsigned int outCount;
objc_property_t *properties = class_copyPropertyList(LenderClass, &outCount);
你就可以得到物業名稱:
const char *property_getName(objc_property_t property)
如果您將這些名稱傳回addObserver:forKeyPath:options:context
您應該是金色的。
這真是太棒了謝謝你。 :)有點迂迴的方式,但非常有用。 :) – 2013-05-15 08:20:59
一些想法:
1)你可以要求的屬性和實例變量,它們的類型運行,並利用這些信息來創建,並採取了觀察員。顯然,如果你正在爲一個對象做這件事,很多工作。
2)如果你的屬性是「正規軍」,這意味着所有強的物體,那麼你可以使用@dynamic(防止二傳手/吸氣創建),然後用resolveInstanceMethod:
或其他時髦的方法從NSObject的趕setMyObject:
和myObject
電話。實質上你可以做系統爲'set ...'調用做什麼,並動態地獲取變量的字符串。然後,你可以更新/獲得一個伊娃,也許這個伊瓦爾的前綴是「 - 」或什麼的,你就可以做你的觀察員會做的事情。
3)你可以把所有的ivars放在一個「助手」類中,然後使用forwardingTargetForSelector:
將所有的設置者指向它(這當然可以回覆你)。我在one of my github projects
[Key Value Observing - 如何觀察對象的所有屬性?](http://stackoverflow.com/questions/13491454/key-value-observing-how-to-observe-all-the -properties-of-an-object) – Caleb 2013-05-14 15:39:47