Изменить состояние NSMenuitem в Menucontroller от AppController?
-
10-10-2019 - |
Вопрос
Мой код разделен на две основные реализации: 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» в качестве пути ключа модели. Затем вы можете удалить весь опубликованный вами код, и он просто будет работать.