2012-12-02 2 views
2

저는 Cocoa Bindings를 배우는 중이지만 걸림돌을 맞았습니다. 바인딩 값이 변경 될 때 메서드를 호출 할 수있는 방법이 있습니까?코코아 바인딩 값이 변경되었다는 알림을 수신하려면 어떻게해야합니까?

예 :

내가 int를 설정하는 NSStepperNSUserDefaults에 결합하고,하지만 난 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의 예) : 자체가 KVO를 기반으로 코코아 바인딩 것을

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

참고.

면책 사항 :이 답변의 모든 코드는 브라우저에 입력했습니다. 정확해야하지만 오타 또는 두 개가있을 수 있습니다.

+0

NSUserDefaults (또는 KVO 호환)의 동일한 키에 둘 이상의 컨트롤을 바인딩 할 수 있습니다. 따라서 현재 값을 표시하는 스테퍼에 텍스트 필드를 중첩하려면 스테퍼가 모델을 수정하면 자동으로 업데이트됩니다. – ipmcc