2012-12-02 37 views
2

我剛剛學習可可綁定,但我碰到了一個障礙。當綁定的值發生變化時,有沒有辦法調用方法?如何接收可可綁定值已更改的通知?

例子:

我綁定的NSStepperNSUserDefaults設置一個int,但我需要當INT改變爲能夠更新一些其他的東西。有沒有辦法直接從對象控制器接收通知?或者我應該以某種方式觀察NSStepper
如果是這樣,我該怎麼做?當它已經綁定時,IB似乎不喜歡我搞砸它。

+0

如果你可以提供更多的信息 –

回答

0

如果您還記得通知,通知中心,觀察員@selector :,那麼您的工作就完成了。

編輯:

你可以觀察INT的變化,通過它的類。它取決於你,你如何實現它,雖然IB或通過代碼。

+0

我試着爲myTextField.integerValue設置一個觀察者,但它不會觸發。你有什麼限制可以觀察? – Weston

4

您可以使用Key Value Observing (KVO)直接觀察NSUserDefaults。註冊的通知,像這樣:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
[userDefaults addObserver:self forKeyPath:@"YourUserDefaultsKey" options:0 context:NULL]; 

然後實現這一點,它會被稱爲每當@"YourUserDefaultsKey"變化值:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    if (object == userDefaults && [keyPath isEqualToString:@"YourUserDefaultsKey"]) { 
     int intValue = [userDefaults intValueForKey:@"YourUserDefaultsKey"]; 
     // Do whatever you need to do with new intValue 
    } 
} 

最後,不要忘記註銷作爲觀察員無論它在哪裏適當的(例如,在-dealloc):

- (void)dealloc 
{ 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    [userDefaults removeObserver:self forKeyPath:@"YourUserDefaultsKey"]; 
} 

需要注意的是Cocoa綁定本身是基於志願。

聲明:我在瀏覽器中輸入了此答案中的所有代碼。它應該是正確的,但可能有一兩個錯字。

+0

值得一提的是,您可以將多個控件綁定到NSUserDefaults上的同一個鍵(或其他任何與KVO兼容的鍵)。因此,如果您希望文本字段嵌套到顯示當前值的步進器,只需將其綁定到同一個鍵,並且在步進器修改模型時它將自動更新。 – ipmcc

相關問題