2013-02-08 4 views
8

두 개의 창이 있습니다. Window A가 NIB에서로드되었습니다. 창 B는 프로그래밍 방식으로 생성됩니다.bind : toObject : withKeyPath : options : 단방향 바인딩입니까?

두 창에는 모두 NStextView가 있습니다. Window A의 textview 속성이 text의 IB을 사용하여 바인딩됩니다. Window B의 textview의 attributedString은 -[NSObject bind:toObject:withKeyPath:options:] 메서드를 사용하는 모델의 text 속성에 바인딩됩니다.

[textview bind:@"attributedString" toObject:obj withKeyPath:@"text" options:nil]; 

는 여기에 이상한 일이 : 창 B의 텍스트 뷰는 실제로 obj.text에 바인딩되어 있지만, 텍스트 뷰의 변화는 obj.text으로 업데이트되지 않습니다. 그러나 Window A의 텍스트 뷰를 변경하면 obj.text과 Window B의 텍스트 뷰가 적절히 업데이트됩니다.

그래서 저는 -[NSObject bind:toObject:withKeyPath:options:] 방법이 단방향 바인딩만을위한 것이라고 생각합니다. 나는 코코아 문서에서 명확한 설명을 찾을 수 없었다. 어느 누구도이 문제에 경험이 있습니까? 코드에서 양방향 바인딩을 어떻게 구현합니까?

답변

3

코코아 바인딩은 본질적으로 양방향이지만 특정 동작 (예 : 텍스트 필드의 연속/실시간 업데이트)에는 특정 옵션을 설정해야합니다. IB에서 "계속 업데이트 값"확인란을 선택해야합니다. 프로그래밍 방식으로 동등한 동작을 얻으려면 바인딩에 options을 지정해야합니다. 즉,이 같은 것을 볼 수 있습니다

[textview bind: NSAttributedStringBinding 
     toObject: obj 
    withKeyPath: @"text" 
     options: (@{ 
       NSContinuouslyUpdatesValueBindingOption : @YES })]; 

그것은 설정시 프로그램 바인딩은 IB에 바인딩 동등한를 확인하고 프로그램 바인딩에 모두 같은 설정을 전달하는 확인하고 가치가 있음을 언급 할 가치가있다. 예를 들어, IB에서 "여러 값 편집 허용", "조건부로 편집 가능"및 "적용되지 않는 키 발생"옵션이 기본적으로 NSTextView의 속성 문자열 바인딩에 대해 선택되어 있음을 확인합니다. 즉 의미 우리의 프로그램 아마해야 바인딩 정말 같은보기 :

[textview bind: NSAttributedStringBinding 
     toObject: obj 
    withKeyPath: @"text" 
     options: (@{ 
       NSContinuouslyUpdatesValueBindingOption : @YES, 
       NSAllowsEditingMultipleValuesSelectionBindingOption : @YES, 
       NSConditionallySetsEditableBindingOption : @YES, 
       NSRaisesForNotApplicableKeysBindingOption : @YES })]; 
+0

이것은 여전히 ​​저에게 효과가 없었습니다. 여기에 대한 답변을 찾았습니다 (내 경우) -> http://stackoverflow.com/questions/1169097/can-you-manually-implement-cocoa-bindings –

+0

위의 링크 된 질문의 관련성에 대해 잘 모르겠습니다. . 여기에 언급 된 바인딩은 두 개의 NSControl 객체 사이에 있으며 사용자 정의 바인딩 구현은 필요하지 않습니다. – stevesliva

2

예, 바인드 : toObject : withKeyPath : 옵션 : 하나의 방법이며 어떤 옵션이 영향을 미칠 수 있습니다. 이것은 .nib 파일에서 바인딩하는 것과 같지 않습니다. 평소처럼 애플은 문서에서 그런 간단한 것을 언급하는 것을 잊었다. 가장 간단한 해결책은 전달 바인딩을 만들 때 동시에 역 바인딩을 생성하는 것입니다. 값을 할당 할 때 코드가 돌아 가지 않을 것입니다. 다음은 사용자 기본값이있는 예입니다.

// two way binding of MyObject.myValue to user defaults 
[NSUserDefaultsController.sharedUserDefaultsController.values bind: @"myValueInDefaults" 
                  toObject: myObject 
                 withKeyPath: @"myValue" 
                  options: @{@"NSContinuouslyUpdatesValue":@YES}]; 

[myObject bind: @"myValue" 
     toObject: NSUserDefaultsController.sharedUserDefaultsController 
    withKeyPath: @"values.myValueInDefaults" 
     options: @{@"NSContinuouslyUpdatesValue":@YES}]; 
+0

두 개의 NSValueTransformers를 사용해야합니까, NSValueTransformerBindingOption 키에 대해 하나의 값을 다른 값으로 변환해야하거나 그 반대의 경우도 필요합니까? – rraallvv

+0

이러한 바인딩은 서로 연결되어 있지 않으므로 각 바인딩에 하나씩 두 개의 NSValueTransformers가 필요하다고 생각합니다. 하지만 NSValueTransformerBindingOption 사용하지 않은 및 확실히 말할 수 없습니다. –

+0

도를 라디안으로, 그 반대로도 볼 수 있는데, 두 개가 필요하다고 생각합니다. 감사합니다. – rraallvv