2013-02-14 62 views
15

我有一個名爲myName在我的類屬性,如:發送通知當一個屬性更改使用志願

@property (nonatomic, strong) NSString *myName; 

我需要當myName屬性的值更改爲發送通知。

現在我正在做這樣的事情:

- (void)setMyName:(NSString *)name 
{ 
    _myName = name; 
    [[NSNotificationCenter defaultCenter] postNotificationName:CHANGE_NOTIFICATION object:nil]; 
} 

我知道有類似iOS中Key-Value Observing。但我不知道如何實現它,我閱讀了整個文檔,但無法得到很好的理解。

請幫助我瞭解如何在不使用自定義setter的情況下實現它。

回答

31

試試這個:

MyClass *var = [MyClass new]; 
[var addObserver:self forKeyPath:@"myName" options:NSKeyValueChangeOldKey context:nil]; 

和實施

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 

} 

時MYNAME屬性更改

+0

謝謝您的回答:) – 2013-02-14 10:50:41

+0

歡迎你) – alex 2013-02-14 11:50:06

+0

您好,我想知道如果國際志願者組織的解決方案是更好的那麼其他實施解。任何人都可以解釋嗎? – NicTesla 2015-03-25 08:21:07

15

- (void)setMyName:(NSString *)name做這個方法會被隨時叫,而不是

[self willChangeValueForKey:@"myName"]; 
_myName = name; 
[self didChangeValueForKey:@"myName"]; 

//this generates the KVO's 

而且要聽(在的viewController),在viewDidLoad中有加入這一行:

[W的addObserver:自forKeyPath:@ 「MYNAME」 選項:NSKeyValueObservingOptionNew方面:零]

//通過這樣做,您註冊viewController以收聽KVO。

,並實現此方法:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if ([[change objectForKey:NSKeyValueChangeNewKey] isEqual:[NSNull null]]) { 
     return; 
    } else { 
     //read the change dictionary, and have fun :) 
    } 
} 

//調用此方法,每當屬性的值被改變。

+0

感謝您的回答:) – 2013-02-14 10:51:03

+3

這個答案比接受的答案要好得多,它沒有說明如何實現KVO,只知道如何聽已經實施的KVO notifs – Chris 2015-03-26 01:10:53

7

要做到這一點沒有客戶設置,只需綜合屬性設置器。這將創建對willChangeValueForKey/didChangeValueForKey的所有支持調用。

@synthesize myName;

然後設置屬性值用點語法:

self.myName = @ 「伊尼戈蒙託亞」

然後觀察者將自動接收KVO通知。

(你需要釋放你的觀察對象之前刪除的觀察者。)

+0

感謝您的回答:) – 2013-02-14 11:16:25