У меня есть NSMenu, высовывающийся из NSStatusItem с помощью popUpStatusItemMenu. Эти NSMenuItems показывают набор различных ссылок, и каждый соединен с setAction: к openLink: метод цели. Это расположение хорошо работало в течение долгого времени. Пользователь выбирает ссылку из меню и openLink: метод затем имеет дело с ним.
К сожалению, я недавно решил экспериментировать с использованием setView NSMenuItem: метод для обеспечения более хорошего интерфейсного / интерфейсного дождевика. В основном я просто прекратил устанавливать заголовок, создал NSMenuItem и затем использовал setView: отобразить пользовательское представление. Это работает отлично, пункты меню выглядят большими, и мое пользовательское представление отображено.
Однако, когда пользователь выбирает пункт меню и выпускает мышь, действие больше не работает (т.е. openLink: не назван). Если я просто комментирую setView: звоните, затем действия работают снова (конечно, пункты меню являются пробелом, но действие выполняется правильно). Мой первый вопрос, затем, состоит в том, почему установка представления повреждает действие NSMenuItem.
Без проблем, я думал, я зафиксирую его путем обнаружения события mouseUp в моем пользовательском представлении и вызова моего метода действия оттуда. Я добавил этот метод к своему пользовательскому представлению:
- (void)mouseUp:(NSEvent *)theEvent {
NSLog(@"in mouseUp");
}
Провал! Этот метод никогда не называют.
Я могу установить отслеживание, реагирует, и получите mouseEntered: события, все же. Я поместил несколько тестов в свою mouseEntered стандартную программу, следующим образом:
if ([[self window] ignoresMouseEvents]) { NSLog(@"ignoring mouse events"); }
else { NSLog(@"not ignoring mouse events"); }
if ([[self window] canBecomeKeyWindow]) { dNSLog((@"canBecomeKeyWindow")); }
else { NSLog(@"not canBecomeKeyWindow"); }
if ([[self window] isKeyWindow]) { dNSLog((@"isKeyWindow")); }
else { NSLog(@"not isKeyWindow"); }
И получил следующие ответы:
not ignoring mouse events
canBecomeKeyWindow
not isKeyWindow
Действительно ли это - проблема? "не isKeyWindow"? По-видимому, это не хорошо, потому что в документах Apple говорится, "Если пользователь нажимает представление, которое не находится в ключевом окне, по умолчанию окно выдвинуто и сделано ключом, но событие от нажатия мыши не диспетчеризируется". Но должен быть путь, действительно обнаруживают эти события. КАК?
Добавление:
[[self window] makeKeyWindow];
не имеет никакого эффекта, несмотря на то, что canBecomeKeyWindow - ДА.
Добавьте это в ваше пользовательское представление, и все будет в порядке:
- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent
{
return YES;
}
Я добавил этот метод в свой пользовательский вид, и теперь все работает прекрасно:
- (void)viewDidMoveToWindow {
[[self window] becomeKeyWindow];
}
Надеюсь, это поможет!
Добавьте этот метод в свой пользовательский NSView, и он будет отлично работать с событиями мыши
- (void)mouseUp:(NSEvent*) event {
NSMenuItem* mitem = [self enclosingMenuItem];
NSMenu* m = [mitem menu];
[m cancelTracking];
[m performActionForItemAtIndex: [m indexOfItem: mitem]];
}
Но у меня возникли проблемы с обработкой ключей, если вы решили эту проблему, возможно, вы можете перейти к моему вопросу и немного помочь мне.