2010-02-11 1 views
3

NSMenuItem의 "값"바인딩을 BOOL에 바인딩하는 데 문제가 있습니다. NSMenuItem의 값 바인딩이 BOOL과

나는 이것에 문제를 단순화 :

1) 그렇지 않으면 (작동하지 않습니다 BOOL의 값을 변경하는 액션 메소드를 호출해야하는 메뉴 항목을 즉 NSButton을 변경하는 방법을 호출하는 경우

2) 조치 방법으로 BOOL을 일정하게해도 (즉, enabled = YES) 메뉴 항목의 "값"이 계속 변경됩니다.

아이디어가 있으십니까? 난 너무 혼란 스러워요! 여기

코드입니다 : 내 펜촉에서

@implementation Menu_BindingsAppDelegate 

@synthesize foo; 

- (IBAction)toggle:(id)sender 
{ 
    [self setFoo:!foo]; 
} 

- (IBAction)makeYes:(id)sender 
{ 
    [self setFoo:YES]; 
} 

@end 

Menu_BindingsAppDelegate.m

MenuBindings_AppDelegate.h

#import <Cocoa/Cocoa.h> 

@interface Menu_BindingsAppDelegate : NSObject <NSApplicationDelegate> 
{ 
    BOOL foo; 
} 

- (IBAction)toggle:(id)sender; 
- (IBAction)makeYes:(id)sender; 

@property BOOL foo; 

@end 

, I는 버튼을 -makeYes에 연결 한 : action과 -toggle : action에 연결된 메뉴 항목. 메뉴 항목의 "값"바인딩은 앱 대리인의 "foo"속성에 바인딩됩니다.

감사합니다.

답변

2

코코아 바인딩은 모델 객체의 변경 사항에 대한 알림을 얻기 위해 Key-Value Observing (KVO)을 사용합니다. 옵저버가 바인딩을 사용하는 뷰를 포함하여 관찰자가 모델 변경을 알기 위해서는 Key-Value Coding 호환 접근 자 메소드를 사용하여 모델을 업데이트해야합니다. ivar 값을 직접 설정하면 KVO 알림이 전송되지 않습니다.

KVC 접근자를 직접 구현하거나 속성을 선언하고 구현시 @synthesize 키워드를 사용하여 컴파일러에서 호환 접근자를 만들도록 할 수 있습니다.

은 KVC 준수 접근 구현하는 것이 방법입니다

//YourModel.h 
@interface YourModel : NSObject 
{ 
    BOOL enabled; 
} 
- (BOOL)enabled; 
- (void)setEnabled:(BOOL)flag; 
@end 

//YourModel.m 
@implementation YourModel 
- (BOOL)enabled 
{ 
    return enabled; 
} 
- (void)setEnabled:(BOOL)flag 
{ 
    enabled = flag; 
} 
@end 

을하고 이것은 당신이 오브젝티브 C 2.0 속성 구문을 사용하여 같은 일을 할 것입니다 방법은 다음과 같습니다

//YourModel.h 
@interface YourModel : NSObject 
{ 
    BOOL enabled; 
} 
@property BOOL enabled; 
@end 

//YourModel.m 
@implementation YourModel 
@synthesize enabled; 
@end 

그런 다음 수를 [yourModel setEnabled:YES]로 전화하면 등록 된 KVO 옵저버 (메뉴 바인딩 포함)에게 변경 사항이 통보됩니다.

또는 가능한 경우 적절한 KVC 접근 장치를 사용하는 yourModel.enabled = YES으로 전화 할 수 있습니다.

어떻게 완료했는지 보여주기 위해 sample project을 업로드했습니다.

+0

제안 해 주셔서 감사합니다. willChangeValueForKey :/didChangeValueForKey :를 사용하고 @ property/@ behavior를 사용하여 동작을 시도했지만 이상한 결과를 얻고 있습니다 ... – chrisgoyal

+0

코드를 게시 할 수 있습니까? KVC 호환 접근자를 구현하는 경우 will/didChangeValueForKey :를 사용할 필요가 없습니다. –

+0

감사합니다. 코드로 업데이트되었습니다. – chrisgoyal