1

私のコードは、MenuController.m と AppController.m の 2 つの主要な実装に分割され、それぞれにヘッダー ファイルがあります。

NSUserDefaults を使用して保存され、NSMenuItems を介して変更されたユーザー設定がいくつかあり、有効にするとチェック マークが表示されます ( setState: NSOffStateを使用)。設定に欠けている部分が 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 から: (prefs と 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];
 }
}

助けてくれてありがとう!

4

1 に答える 1

3

これを実現する方法はいくつかあります。まず、awakeFromNib 実装を、アウトレットにアクセスできる MenuController クラスに移動するだけです。awakeFromNib は App Delegate に固有のものではありませんが、Nib からロードされるすべてのオブジェクトで使用できます (MenuController にアウトレットがあるため、Nib からロードされると想定しています)。

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

または、すべてのコードを削除して、Interface Builder でバインディングのみを使用します。メニュー項目の「値」(== 状態) を「共有ユーザー デフォルト コントローラー」にバインドし、モデル キー パスとして「LiveIcon」を入力できます。その後、投稿したすべてのコードを削除すると、機能するようになります。

于 2011-01-13T04:56:08.830 に答える