AppControllerからMenucontrollerのnsmenuitem状態を変更しますか?
-
10-10-2019 - |
質問
私のコードは、Menucontroller.mとAppController.mの2つの主要な実装に分割されています。それぞれがヘッダーファイルを備えています。
nsuserdefaultsを使用して保存され、nsmenuitemsを介して変更されたユーザー設定がいくつかあります。 SetState:nsoffstate)。私のセットアップに欠落しているビットは1つだけです - 私にはアプリが必要です SetState プリフェスでオプションがオンになっている場合、スタートアップのメニュー項目の場合。ただし、アプリの起動で何かを設定するために私が知っている唯一の方法は、 Awakefromnib 方法、そしてそれはAppControllerにあり、にアクセスできません nsmenuitem Menucontrollerにインスタンス化されています。
私は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];
}
AppController.mから:(機能しませんが、これはその要点です)
- (void) awakeFromNib{
// Update menu items
if ([standardUserDefaults boolForKey:@"LiveIcon"] == TRUE) {
[liveIconItem setState: NSOnState];
} else {
[liveIconItem setState: NSOffState];
}
}
助けてくれてありがとう!
解決
これを達成する方法はいくつかあります。まず、Awakefromnibの実装をMenucontrollerクラスに移動するだけで、アウトレットにアクセスできます。 Awakefromnibはアプリデリゲートに固有のものではありませんが、ペン先からロードされたすべてのオブジェクトに使用できます(メニューコントローラーにアウトレットがあるため、ペン先からロードされていると思います)。
また、bealtemenuitem:、常にyesを返しますが、パラメーターとして指定されているメニュー項目の状態を設定することもできます。
または、すべてのコードを取り除き、インターフェイスビルダーでバインディングを使用します。メニュー項目の「値」(==ステート)を「共有ユーザーデフォルトコントローラー」にバインドし、モデルキーパスとして「LiveIcon」を入力できます。その後、投稿したすべてのコードを削除でき、機能します。