Сохранить предпочтение, чтобы показать или скрыть NSStatusItem

У меня есть приложение, которое работает как обычное приложение, но также имеет NSStausItem. Я хотел реализовать возможность установить в настройках флажок, и когда этот флажок включен, элемент состояния должен отображаться, но когда флажок снят, элемент состояния должен быть удален или быть невидимым.

Я нашел кого-то, кто столкнулся с подобной проблемой на форуме здесь: Как включить или выключить пункт состояния в строке меню с помощью флажка?

Но проблема с этим решением заключается в том, что оно не работает должным образом. Поэтому я устанавливаю этот флажок, и все работает нормально, но когда я открываю приложение во второй раз, приложение не распознает выбор, который я сделал при первом запуске. Это связано с тем, что флажок не привязан к BOOL или чему-то еще, флажок имеет только IBAction, который удаляет или добавляет элемент состояния во время выполнения.

Итак, мой вопрос: как я могу установить флажок в настройках, который позволяет мне выбирать, должен ли отображаться элемент статуса или нет.


Хорошо, на самом деле я попробовал следующее, я скопировал из сообщения, которое я дал вам ссылку

В AppDelegate.h:

 NSStatusItem *item;
NSMenu *menu;
IBOutlet NSButton myStatusItemCheckbox;

а затем в Delegate.m :

- (BOOL)createStatusItem
{
NSStatusBar *bar = [NSStatusBar systemStatusBar];

//Replace NSVariableStatusItemLength with NSSquareStatusItemLength if you
//want the item to be square
item = [bar statusItemWithLength:NSVariableStatusItemLength];

if(!item)
  return NO;

//As noted in the docs, the item must be retained as the receiver does not 
//retain the item, so otherwise will be deallocated
[item retain];

//Set the properties of the item
[item setTitle:@"MenuItem"];
[item setHighlightMode:YES];

//If you want a menu to be shown when the user clicks on the item
[item setMenu:menu]; //Assuming 'menu' is a pointer to an NSMenu instance

return YES;
}


- (void)removeStatusItem
{
NSStatusBar *bar = [NSStatusBar systemStatusBar];
[bar removeStatusItem:item];
[item release];
}


- (IBAction)toggleStatusItem:(id)sender
{
BOOL checked = [sender state];

if(checked) {
  BOOL createItem = [self createStatusItem];
  if(!createItem) {
    //Throw an error
    [sender setState:NO];
  }
}
else
  [self removeStatusItem];
}

затем в IBaction я добавил это:

[[NSUserDefaults standardUserDefaults] setInteger:[sender state]
                                               forKey:@"MyApp_ShouldShowStatusItem"];

и в моем awakefromnib я добавил это: `

NSInteger statusItemState = [[NSUserDefaults standardUserDefaults] integerForKey:@"MyApp_ShouldShowStatusItem"];
 [myStatusItemCheckbox setState:statusItemState];

Затем в построителе интерфейса я создал новый флажок, соединил его с «myStatusItemCheckbox» и добавил IBaction, также я щелкнул инспектор привязок и установил в значении следующую привязку к: NSUserDefaultController и как ModelKeyPath я установил: MyApp_ShouldShowStatusItem. К сожалению, это не работает в все что я делаю не так?


person dehlen    schedule 22.04.2011    source источник


Ответы (1)


Что вам нужно сделать, так это использовать систему Пользовательские настройки по умолчанию. . Это позволяет очень легко сохранять и загружать настройки.

В действии кнопки вы сохраните ее состояние:

- (IBAction)toggleStatusItem:(id)sender {

    // Your existing code...

    // A button's state is actually an NSInteger, not a BOOL, but
    // you can save it that way if you prefer
    [[NSUserDefaults standardUserDefaults] setInteger:[sender state]
                                               forKey:@"MyApp_ShouldShowStatusItem"];
}

и в вашем делегате приложения (или другом соответствующем объекте) awakeFromNib вы прочитаете это значение обратно из пользовательских значений по умолчанию:

 NSInteger statusItemState = [[NSUserDefaults standardUserDefaults] integerForKey:@"MyApp_ShouldShowStatusItem"];
 [myStatusItemCheckbox setState:statusItemState];

а затем обязательно вызовите removeStatusItem, если это необходимо.

Эта процедура применима практически к любому параметру, который вы хотите сохранить.

person jscs    schedule 22.04.2011
comment
Большое спасибо, я попробую позже;) - person dehlen; 22.04.2011
comment
Вы также должны использовать значение. Вместо того, чтобы сохранять значение и извлекать его из флажка, контроллер должен знать, должен ли элемент состояния находиться непосредственно в строке состояния. Поскольку это двоичный выбор, это должно быть логическое значение, и контроллер должен сохранить его как таковое в значениях по умолчанию и установить флажок либо на NSOnState, либо на NSOffState в зависимости от логического значения. (NSOnState и YES определены для одного и того же числа, и то же самое для NSOffState и NO, но ясность и ясность являются достоинствами.) - person Peter Hosey; 23.04.2011