Изменить состояние NSMenuitem в Menucontroller от AppController?

StackOverflow https://stackoverflow.com/questions/4676764

Вопрос

Мой код разделен на две основные реализации: menucontroller.m и appcontroller.m, каждая с файлами заголовка.

У меня есть пара предпочтений пользователей, которые хранятся с использованием nsuserdefaults, и меняются через nsmenuitem SETSTATE: NSOFFSTATE) Есть только одна недостатка в моей настройке- мне нужно приложение, чтобы Setstate Для этих пунктов меню на запуске, если варианты включены в Prefs. Тем не менее, единственный способ, которым я знаю, установить что -то на запуск приложения, - это иметь его в Awakefromnib метод, и это в AppController и не может получить доступ к Nsmenuitem создан в сфере Menucontroller.

Я довольно новичок в Objective-C, и мне удалось зайти так далеко благодаря многим полезным учебным пособиям и ответам на этом сайте, но сейчас я просто в тупике.

Я пытался использовать методы класса и объекта для изменения настройки, но мне не удалось использовать существующий экземпляр NSMenuitems. validatemenuitem выглядел многообещающе, но это только включает и отключает меню и не устанавливает штат.

Соответствующий код (я думаю):

от 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];
 }
}

Спасибо за помощь!

Это было полезно?

Решение

Есть несколько способов достичь этого. Во -первых, вы можете просто переместить свою реализацию Awakefromnib в свой класс Menucontroller, где у вас есть доступ к торговым точкам. Awakefromnib не зависит от делегата приложения, но доступен для всех объектов, которые загружены из NIB (поскольку у вас есть выходы в вашем Menucontroller, я предполагаю, что он загружен из NIB).

Вы также можете реализовать Validatemenuitem:, всегда возвращать да, но также установить состояние меню, которое дано вам в качестве параметра.

Или избавьтесь от всего кода и просто используйте привязки в интерфейсном строителе. Вы можете связать «значение» (== состояние) элемента вашего меню с «контроллером по умолчанию общего пользователя» и ввести «LiveICon» в качестве пути ключа модели. Затем вы можете удалить весь опубликованный вами код, и он просто будет работать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top