2011-01-13 9 views
1

私のコードは2つの主な実装に分割されています:それぞれがヘッダファイルを持つMenuController.mとAppController.m。AppControllerからMenuControllerのNSMenuItem状態を変更しますか?

私は(SETSTATEを使用して:NSOffState)が有効になったときに、彼らはチェックマークが表示されるようにNSUserDefaultsを使用して格納し、NSMenuItems介して変更されているカップルのユーザー設定を、持っています。私のセットアップの欠けているビットが1つしかありません。オプションが設定されている場合、起動時にこれらのメニュー項目のためにの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から:(環境設定を変更する方法とsetState-は素晴らしい作品)

- (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]; 
} 

AppController.mから:(これは機能しませんが、これはその要点です)

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

ありがとうございました!

答えて

3

これを達成する方法はいくつかあります。まず、awakeFromNib実装をMenuControllerクラスに移動するだけで、コンセントにアクセスできます。 awakeFromNibはApp Delegateに固有ではありませんが、Nibsからロードされたすべてのオブジェクトで使用できます(あなたがMenuControllerにコンセントを持っているので、Nibからロードされていると仮定します)。

validateMenuItem:を実装することもできますが、常にYESを返しますが、パラメータとして指定されたメニュー項目の状態も設定します。

または、すべてのコードを取り除き、Interface Builderでバインディングを使用してください。メニューアイテムの「値」(==状態)を「共有ユーザーデフォルトコントローラ」にバインドし、モデルキーパスとして「LiveIcon」と入力することができます。投稿したすべてのコードを削除することができ、それだけでうまくいくでしょう。

+0

うわー、ありがとう!最初の方法を使用しました。これは、現在作業中のコードからの変更が最小です。 awakeFromNibが* any * nibオブジェクトに存在することはありませんでした。ここで私は難しい道を回っていた...ありがとうございました。 – shrakner

関連する問題