2012-12-05 2 views
2

내 모델의 일부 데이터를 상태 표시 줄 메뉴에 표시하고 싶습니다. 그래서, 나는 NSMenuItem의 제목에 내 엔티티 객체를 바인딩 : 그것은 초기화에서 지금까지 잘 작동NSMenuItem의 모델 데이터 표시

 [self.statusMenu setAutoenablesItems:NO]; 

     NSMenuItem * exportMenuItem = [[NSMenuItem alloc] init]; 
     [exportMenuItem bind:@"title" toObject:expo withKeyPath:@"menuItemTitle" options:nil]; 
     [exportMenuItem setEnabled:NO]; 

     [self.statusMenu insertItem:exportMenuItem atIndex:3]; 

. 그러나 내 모델을 업데이트하면 NSMenuItem의 제목이 업데이트되지 않습니다.

+0

'expo'객체에 대해 알지 못해서 메뉴 항목 제목이 업데이트되지 않는 이유를 말할 수 없습니다. 키'menuItemTitle'에 대해 KVO를 준수합니까? 'menuItemTitle'의 값은 어떻게 갱신되고 있습니까? (당신은'@ "title"'대신에'NSTitleBinding'을 사용하기를 원할 수도 있습니다.) – ipmcc

+0

@ipmcc 어이, 당신의 대답으로 인해 나는 그 이유를 추측합니다. 'menuItemTitle'은 진짜 속성이 아닙니다. 이것은 하나의 문자열에 엑스포의 여러 속성을 결합하는 방법 일뿐입니다. ('NSTitleBinding' 허용) –

답변

0

을,이 문제에 정규 솔루션은이 같은 클래스 메소드를 구현하는 것입니다 메서드를 호출하면 다른 속성이 변경 될 때마다 프레임 워크에서 willChangeValueForKey:didChangeValueForKey:menuItemTitle으로 호출하여 처리합니다.

0

좋아 알겠습니다 :

menuItemTitleexpo가 두 특성을 결합 실제 동적 게터 방법이다. 따라서 NSMenuItem의 제목이 업데이트되지 않는 이유는 아마 menuItemTitle이 실제로 설정되지 않을 것입니다.

그래서 내 속성 중 하나가 설정되었을 때 menuItemTitle이 변경되었다고 어떻게 알 수 있습니까? expo의 설정자가 [self willChangeValueForKey:@"menuItemTitle"];[self didChangeValueForKey:@"menuItemTitle"];을 추가하는 것은 setter 자체를 반복해서 호출 할 때 무한 루프를 유발하므로 작동하지 않습니다. 그래서 여기

내 솔루션입니다 : 내가 [NSManagedObject setValue:(id)value forKey:(NSString *)key] 오버라이드 : 당신이를 구현하는 경우

+ (NSSet *)keyPathsForValuesAffectingMenuItemTitle 
{ 
    return [NSSet setWithObjects: @"propertyMenuItemTitleDependsOn1", 
            @"propertyMenuItemTitleDependsOn2", 
            nil]; 
} 

: 참고로

- (void)setValue:(id)value forKey:(NSString *)key { 
    [self willChangeValueForKey:@"menuItemTitle"]; 
    [super setValue:value forKey:key]; 
    [self didChangeValueForKey:@"menuItemTitle"]; 
} 
관련 문제