2014-11-25 6 views
2

코코아 바인딩의 방향성을 이해하려고합니다. 특히, 바인딩을 시연하기 위해이 작은 프로그램을 작성했으며, 왜 그것이 출력 하는지를 잘 모르겠습니다.코코아 바인딩이 역순으로 업데이트되지 않습니다.

@interface SimpleClass : NSObject 
@property (retain) NSString *s; 
@end 

@implementation SimpleClass 
@end 

int main(int argc, char *argv[]) { 
    SimpleClass *simpleClass1 = [[SimpleClass alloc] init]; 
    SimpleClass *simpleClass2 = [[SimpleClass alloc] init]; 

    [simpleClass1 bind:@"s" toObject:simpleClass2 withKeyPath:@"s" options:nil]; 

    //[simpleClass1 willChangeValueForKey:@"s"]; 
    simpleClass1.s = @"Hello, World!"; 
    //[simpleClass1 didChangeValueForKey:@"s"]; 

    NSLog(@"%@", simpleClass1.s); 
    NSLog(@"%@", simpleClass2.s); 

    simpleClass2.s = @"Something else!"; 

    NSLog(@"%@", simpleClass1.s); 
    NSLog(@"%@", simpleClass2.s); 

    return 0; 
} 

내가이 프로그램을 실행하면 출력은 다음과 같습니다 :이 바인딩은 단방향 있다고 생각하는 날 리드

Hello, World! 
(null) 
Something else! 
Something else! 

여기에 프로그램입니다. 그러나, 나는 thisthis을 보았습니다. 둘 다 바인딩이 양방향이어야한다고 (둘 다 분명하지는 않지만) 말합니다. willChangeValueForKey 및 didChangeValueForKey 행의 주석을 해제해도 출력에는 영향을주지 않습니다.

바인딩이 단방향인지 궁금합니다. 아니면 바인딩 생성시 양방향이어야한다는 것을 지정하는 방법이 있습니까?

+0

이 게시물 확인 : http://stackoverflow.com/questions/14775326/bindtoobjectwithkeypathoptions-is-one-way-binding – user1502383

+0

오른쪽; 나는 그 질문에 이미 링크되어있다. "NSContinuouslyUpdatesValueBindingOption"에 대한 해당 질문에 대한 대답은 바인딩의 방향성과 관련이없는 것처럼 보입니다. – Litherum

+0

결론은 "바인딩이 ** 단방향 **이라고 믿게 만듭니다." – MartinW

답변

3

NSObject에있는 바인딩의 기본 구현은 단방향입니다. 바인딩은 실제로 read-only입니다.

다른 Cocoa 클래스는보다 강력한 기능을 제공하기 위해 기본 구현의 전부 또는 일부를 무시합니다. 자신의 수업에서 어떻게하는지에 대한 Apple의 가이드는 here입니다. Cocoa의 클래스 중 어떤 것도 바인딩을 구현하지 않는다고 생각합니다.

message flow in bindings의 토론을 확인하십시오.

클래스가 NSKeyValueBindingCreation 프로토콜을 구현할 수 있기 때문에 바인딩 이름이 반드시 속성과 일치하지는 않습니다. 예를 들어 NSTextField"value" binding이지만 "값"속성은 없습니다 (이러한 속성에 대한 키 - 값 코드 명명 규칙을 준수하는 getter 또는 setter는 없습니다).

NSObject이 제공하는 기본 구현이 KVC를 사용하여 바운드 대상 개체의 속성 변경이 해당 구현과 관련된 경우 바인딩 된 개체의 바인딩과 동일한 이름으로 속성을 설정하는 경우가 발생합니다. 물론, 그 구현을 오버라이드 (override)하지 않는 것은 그 클래스를 상속 합니다만, 일부의 클래스는 그것을 오버라이드 (override)합니다.

관련 문제