我剛剛學習可可綁定,但我碰到了一個障礙。當綁定的值發生變化時,有沒有辦法調用方法?如何接收可可綁定值已更改的通知?
例子:
我綁定的NSStepper
到NSUserDefaults
設置一個int,但我需要當INT改變爲能夠更新一些其他的東西。有沒有辦法直接從對象控制器接收通知?或者我應該以某種方式觀察NSStepper
?
如果是這樣,我該怎麼做?當它已經綁定時,IB似乎不喜歡我搞砸它。
我剛剛學習可可綁定,但我碰到了一個障礙。當綁定的值發生變化時,有沒有辦法調用方法?如何接收可可綁定值已更改的通知?
例子:
我綁定的NSStepper
到NSUserDefaults
設置一個int,但我需要當INT改變爲能夠更新一些其他的東西。有沒有辦法直接從對象控制器接收通知?或者我應該以某種方式觀察NSStepper
?
如果是這樣,我該怎麼做?當它已經綁定時,IB似乎不喜歡我搞砸它。
如果您還記得通知,通知中心,觀察員@selector :,那麼您的工作就完成了。
編輯:
你可以觀察INT的變化,通過它的類。它取決於你,你如何實現它,雖然IB或通過代碼。
我試着爲myTextField.integerValue設置一個觀察者,但它不會觸發。你有什麼限制可以觀察? – Weston
您可以使用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綁定本身是基於志願。
聲明:我在瀏覽器中輸入了此答案中的所有代碼。它應該是正確的,但可能有一兩個錯字。
值得一提的是,您可以將多個控件綁定到NSUserDefaults上的同一個鍵(或其他任何與KVO兼容的鍵)。因此,如果您希望文本字段嵌套到顯示當前值的步進器,只需將其綁定到同一個鍵,並且在步進器修改模型時它將自動更新。 – ipmcc
如果你可以提供更多的信息 –