Как включить или отключить элемент состояния в строке меню с помощью флажка?
Я уже создал пункт состояния для строки меню, но я хотел бы добавить флажок, чтобы его можно было включать и выключать.
Поэтому, когда флажок установлен, отображается элемент состояния, а когда флажок не установлен, он не отображается.
Какой код мне нужно сделать это?
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
отсюда мой комментарий рядом со строкой кода.
Получите выход для вашей кнопки, которую вы хотите переключить, а затем создайте метод действия, на который указывает ваш флажок, который переключает скрытое свойство исходной кнопки на основе состояния флажка.