2011-01-13 2 views
1

내 코드는 두 개의 주요 구현으로 나뉩니다. MenuController.m과 AppController.m, 각각 헤더 파일이 있습니다.AppController에서 MenuController의 NSMenuItem 상태를 변경 하시겠습니까?

NSUserDefaults를 사용하여 저장하고 NSMenuItems를 통해 저장된 두 개의 사용자 기본 설정을 사용합니다 (setState : NSOffState 사용). 내 설정의 단 한 가지 누락 된 비트가 있습니다 - 옵션이 환경 설정에있는 경우 시작시 해당 메뉴 항목에 대해 setstate으로 앱이 필요합니다. 그러나 앱을 시작할 때 뭔가 설정하려고하는 유일한 방법은 awakeFromNib 메쏘드에 AppController에 넣고 MenuController에서 인스턴스화 한 NSMenuItem에 액세스 할 수 없도록하는 것입니다.

나는 오히려 Objective-C를 처음 접했고 많은 도움이되는이 튜토리얼과 답변을이 사이트에서 얻을 수 있었지만, 지금 당황 스럽다.

클래스 및 객체 메서드를 사용하여 설정을 변경했지만 실패했습니다. NSMenuItems의 기존 인스턴스를 사용해야합니다. validateMenuItem 유망 해 보이지만, 메뉴를 활성화 및 비활성화하고 setState는 수행하지 않습니다.

관련 코드 (내 생각) : MenuController.h에서

:

@interface MenuController : NSMenu { 
IBOutlet NSMenu *optionsMenu; 
IBOutlet NSMenuItem *onTopItem; 
IBOutlet NSMenuItem *liveIconItem; 
} 

- (IBAction)menuLiveIconToggle:(id)pid; 

MenuController.m에서는 :

- (IBAction)menuLiveIconToggle:(id)pid; { 
//NSLog(@"Live Icon Toggle"); 
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
if ([standardUserDefaults boolForKey:@"LiveIcon"] == TRUE){ 
    [standardUserDefaults setBool:FALSE forKey:@"LiveIcon"]; 
    [liveIconItem setState: NSOffState]; 
} else { 
    [standardUserDefaults setBool:TRUE forKey:@"LiveIcon"]; 
    [liveIconItem setState: NSOnState]; 
} 
[standardUserDefaults synchronize]; 
} 

(방법의 환경 설정을 변경하고 setState- 잘 작동) AppController.m에서 : (작동하지 않습니다, 그러나 그것의 요지입니다)

- (void) awakeFromNib{ 
// Update menu items 
if ([standardUserDefaults boolForKey:@"LiveIcon"] == TRUE) { 
    [liveIconItem setState: NSOnState]; 
} else { 
    [liveIconItem setState: NSOffState]; 
} 
} 

도움 주셔서 감사합니다!

답변

3

이것을 달성 할 수있는 방법에는 여러 가지가 있습니다. 먼저, awakeFromNib 구현을 Outlet에 액세스 할 수있는 MenuController 클래스로 옮기면됩니다. awakeFromNib은 App Delegate에만 국한되지는 않지만 Nibs에서로드 된 모든 객체에 사용할 수 있습니다 (MenuController에 아울렛이 있으므로 Nib에서로드 한 것으로 가정합니다).

또한 validateMenuItem :을 구현할 수 있습니다. 항상 YES를 반환하고 사용자에게 지정된 메뉴 항목의 상태를 매개 변수로 설정합니다.

또는 모든 코드를 제거하고 Interface Builder에서 바인딩을 사용하십시오. 메뉴 항목의 "값"(== 상태)을 "공유 사용자 기본값 컨트롤러"에 바인딩하고 모델 키 경로로 "LiveIcon"을 입력 할 수 있습니다. 그러면 게시 한 모든 코드를 삭제할 수 있으며 제대로 작동합니다.

+0

와우 감사합니다! 첫 번째 방법은 현재 작업중인 코드에서 최소한의 변경으로 사용했습니다. awakeFromNib가 어떤 * nib 객체 (* 오)에있을 수 없다는 것은 나에게 전혀 발생하지 않았습니다. 여기에서 나는 어려운 길을 돌아 다니고 있었다. .. 고맙습니다. – shrakner

관련 문제