2011-01-13 6 views
1

Мой код разделен на две основные реализации: MenuController.m и AppController.m, каждый с файлами заголовков.Изменить состояние NSMenuItem в MenuController из AppController?

У меня есть пара пользовательских предпочтений, которые сохраняются с помощью NSUserDefaults, и изменены с помощью NSMenuItems так, что они показывают, флажков, когда включен (используя SetState: NSOffState). Есть только один недостающий бит моей настройки - мне нужно приложение для setState для этих пунктов меню при запуске, если параметры включены в префиксах. Тем не менее, единственный способ, с помощью которого я могу установить что-то в приложении, - это использовать его в методе awakeFromNib, который находится в AppController, и не может получить доступ к NSMenuItem, созданный в MenuController.

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

Я попытался использовать методы класса и объекта, чтобы изменить настройки, но не удалось - мне нужно использовать существующий экземпляр NSMenuItems. validateMenuItem выглядит многообещающим, но он позволяет включать и отключать меню и не устанавливатьState.

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

из 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, но доступен для всех объектов, загружаемых из Nib (поскольку у вас есть выходы в вашем MenuController, я предполагаю, что он загружен из Nib).

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

Или, избавитесь от всего кода и просто используйте привязки в Interface Builder. Вы можете связать «значение» (состояние) вашего пункта меню с «контроллером стандартных настроек по умолчанию» и ввести «LiveIcon» в качестве пути ключа модели. Затем вы можете удалить весь код, который вы опубликовали, и он будет работать.

+0

Wow thanks! Я использовал первый способ, так как это наименьшее изменение от моего текущего рабочего кода. Мне никогда не приходило в голову, что awakeFromNib может быть в * любом объекте nib (d'oh). Здесь я обошел тяжелый путь ... Спасибо тебе, ТАК МНОГО. – shrakner