Как включить или отключить элемент состояния в строке меню с помощью флажка? - PullRequest
0 голосов
/ 09 мая 2009

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

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

Какой код мне понадобится, чтобы сделать это?

Ответы [ 2 ]

8 голосов
/ 09 мая 2009

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

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, отсюда мой комментарий рядом со строкой кода.

1 голос
/ 09 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...