2012-06-15 6 views
3

코코아의 바인딩에서 널 자리 표시자를 (지역화를 위해) 변경하는 방법이 있습니까?Cocoa 바인딩에서 null 자리 표시자를 변경 하시겠습니까?

바인딩은 Interface Builder에서 팝업 버튼을 위해 설정됩니다. IB에 설정된 바인딩의 양방향 특성이 필요하므로 프로그래밍 방식으로 구현하는 것이 실제로 매력적이지는 않습니다.

nib 파일의 현지화를 처리하는 표준 방법은 각 언어에 대해 하나씩 작성하는 것이지만 언어 버전 간의 전체 nib 파일에서 유일한 차이이므로이 파일은 단일 문자열.

IB에서 만든 바인딩을 수정하는 방법이 있다면 파일 소유자의 awakeFromNib 메서드에서 수행 할 생각이었습니다.

답변

5

NSDocument 클래스와 같이 바인딩 할 컨트롤러 개체에 -bind:toObject:withKeyPath:options:을 재정의하십시오. 이것은 메소드 호출의 대상이 될 필요가 있습니다 - 아래에서 선택하는 객체 nib의에 바인드합니다.

NSObjectController 또는 NSArrayController에 바인딩하는 경우 하위 클래스가 필요합니다.

해당 메서드는 options 사전을 다시 작성하고 NSNullPlaceholderBindingOption의 값을 현지화 된 문자열로 바꾸고 super를 호출해야합니다.

물론 코드에서 전달 된 값을 가져 와서 대신 번역 할 수는 있지만 코드에서 해당 자리 표시 자의 null 자리 표시자를 생략합니다.

+0

매력처럼 작동합니다. 감사합니다. 관심있는 모든 사람들을 위해 나는 선택된 값에 대한 값 변환자를 주변에 몰아 넣었으며, 메뉴의 마지막 옵션으로 추가된다는 점을 제외하고는 잘 동작한다. 반면 null 자리 표시자는 메뉴 상단에 설정된다. – Monolo

+0

Null 값은 다른 편집 가능/사용 가능 동작을 초래하기 때문에 값 변환기를 사용하면 편집 가능 및 사용 가능 바인딩을 유지해야합니다. 두 옵션을 모두 제공 할 생각 이었지만이 방법이 훨씬 쉬워 보였습니다. – paulmelnikow

+1

이것은 나를 위해 작동하지 않았다. 내 NSObjectController' 하위 클래스 및 메서드가 호출되지 않았습니다. – mattsven

0

다른 대답은 더 이상 내가 수정하는 약간 다른 솔루션을 함께 왔어요 그래서 작동하는 것 같다없는 기존의 주어진 널 자리 문자열을 사용하는 바인딩 : 내보기 컨트롤러에이 방법을

:

- (void)awakeFromNib { 
    // Hacky hack hack: Xcode is stupid and doesn't localize the null placeholders so we have to do it. 
    [self rebind:@"contentValues" of:self.fooPopup withNullPlaceholder:NSLocalizedString(@"No foos available", @"foo popup null placeholder")]; 
    [self rebind:@"contentValues" of:self.barPopup withNullPlaceholder:NSLocalizedString(@"No bars available", @"bar popup null placeholder")]; 
} 

localiz을 :

- (void)rebind:(NSString *)binding of:(id)object withNullPlaceholder:(NSString *)nullPlaceholder { 
    // Possibly a bad idea, but Xcode doesn't localize the null placeholder so we have do it manually. 
    NSDictionary *bindingInfo = [object infoForBinding:binding]; 

    id bindObject = bindingInfo[NSObservedObjectKey]; 
    NSString *keyPath = bindingInfo[NSObservedKeyPathKey]; 
    NSMutableDictionary *options = [bindingInfo[NSOptionsKey] mutableCopy]; 
    options[NSNullPlaceholderBindingOption] = nullPlaceholder; 

    [object unbind:binding]; 
    [object bind:binding toObject:bindObject withKeyPath:keyPath options:options]; 
} 

나는 지역화 된 문자열을 전달 필요한 모든 바인딩에 대한 awakeFromNib이 전화 ed 문자열은 보통 Localizable.strings 파일의 일부로 지역화됩니다.

관련 문제