Как включить или отключить элемент состояния в строке меню с помощью флажка?

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

Поэтому, когда флажок установлен, отображается элемент состояния, а когда флажок не установлен, он не отображается.

Какой код мне нужно сделать это?

2 ответа

Решение

Сначала в вашем классе контроллера создайте переменную экземпляра для хранения ссылки на этот элемент:

NSStatusItem *item;

Затем создайте метод для создания этого элемента состояния, когда флажок установлен:

- (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];
}

Затем создайте флажок в IB и установите действие для вашего toggleStatusItem: Способ; убедитесь, что флажок не установлен.

Изменить (в ответ на ошибки) Как указано выше, вам необходимо объявить NSStatusItem в интерфейсе класса, который вы поместили createStatusItem а также removeStatusItem методы; причина того, что это становится переменной экземпляра, а не одной локальной к createStatusItem Метод заключается в том, что нет способа извлечь указатель на элемент, который уже был добавлен в строку состояния в меню Apple, и для того, чтобы удалить элемент, если флажок снят, необходимо сохранить указатель на этот элемент. Это также решит вашу третью ошибку.

В ответ на вашу вторую ошибку я просто продемонстрировал, что если вы хотите добавить пункт меню к своему статусу при нажатии, вы должны добавить код для него самостоятельно, получив указатель на NSMenu; Я показывал, как можно затем добавить этот пункт меню в элемент строки состояния, если указатель был вызван menuотсюда мой комментарий рядом со строкой кода.

Получите выход для вашей кнопки, которую вы хотите переключить, а затем создайте метод действия, на который указывает ваш флажок, который переключает скрытое свойство исходной кнопки на основе состояния флажка.

Другие вопросы по тегам