Удалить выделение из NSMenuItem после нажатия?
Я добавил пользовательский вид в мой подкласс NSMenuItem (который находится в NSStatusMenu), что означает, что по умолчанию он не будет выделен синим / серым фоном.
Я реализовал это с помощью следующего кода:
- (void)drawRect:(NSRect)rect {
BOOL isHighlighted = [menuItem isHighlighted];
if (isHighlighted) {
[[NSColor selectedMenuItemColor] set];
[NSBezierPath fillRect:rect];
[menuItem addHover];
} else {
[super drawRect:rect];
[menuItem removeHover];
}
}
- (void)mouseUp:(NSEvent*)event {
NSMenuItem *item = [self enclosingMenuItem];
NSMenu *menu = [item menu];
[menu cancelTracking];
[menu performActionForItemAtIndex:[menu indexOfItem:item]];
}
Элементы меню выделены отлично, и я также могу нажать на каждый элемент; однако когда я нажимаю на них, они, кажется, сохраняют состояние isHighlighted после того, как я снова открываю меню.
Есть ли способ изменить его, чтобы при щелчке выделенное состояние удалялось при следующем открытии меню?
3 ответа
Я исправил это, удалив метод mouseUp в моем собственном представлении, а затем добавив в него еще один "скрытый" NSView, который имеет следующий метод:
- (BOOL)acceptsFirstResponder {
NSMenu *menu = [item menu];
[menu cancelTracking];
[menu performActionForItemAtIndex:[menu indexOfItem:item]];
return YES;
}
Удивляет, что мы должны сделать это вместо простого NSMenuItem setHighlighted или NSMenu removeHighlights, или чего-то еще. Вот фрагмент, который очень похож на ответ MrWalker-а. Он просто удаляет ваш собственный элемент меню из меню и возвращает его обратно.
NSMenuItem *selfmi = [self enclosingMenuItem];
NSMenu* menu = [[self enclosingMenuItem] menu];
int i = [menu indexOfItem:selfmi];
[menu removeItemAtIndex:i];
[menu insertItem:selfmi atIndex:i];
У меня была уникальная ситуация с главным меню приложения, когда удаление и повторное добавление пунктов меню не убирало выделение пункта меню. Вот функция Swift, которую я использовал для удаления выделения, добавив фиктивный элемент меню, "щелкнув" по нему, а затем удалив фиктивный элемент:
func unhighlightItems(in menu: NSMenu) {
let dummyItem = NSMenuItem(title: "", action: nil, keyEquivalent: "")
menu.addItem(dummyItem)
menu.performActionForItem(at: mainMenu.index(of: dummyItem))
menu.removeItem(dummyItem)
}
Мое решение состояло в том, чтобы удалить и повторно добавить пункты меню после cancelTracking:
- (void)mouseUp:(NSEvent*)event {
NSMenuItem *item = [self enclosingMenuItem];
NSMenu *menu = [item menu];
if (nil != menu) {
NSInteger index = [menu indexOfItem:item];
[menu cancelTracking];
[menu performActionForItemAtIndex:index];
// hack to reset highlighted menu item state
NSArray *items = [menu itemArray];
[menu removeAllItems];
for (NSMenuItem *item in items) {
[menu addItem:item];
}
}
}