Сначала в вашем классе контроллера создайте переменную экземпляра для хранения ссылки на этот элемент:
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
, отсюда мой комментарий рядом со строкой кода.