Пользовательский NSView в NSMenuItem, не получающем события от нажатия мыши

У меня есть 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 - ДА.

8
задан Nifle 8 September 2009 в 23:15
поделиться

3 ответа

Добавьте это в ваше пользовательское представление, и все будет в порядке:

- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent
{
    return YES;
}
9
ответ дан 5 December 2019 в 06:38
поделиться

Я добавил этот метод в свой пользовательский вид, и теперь все работает прекрасно:

- (void)viewDidMoveToWindow {
    [[self window] becomeKeyWindow];
}

Надеюсь, это поможет!

5
ответ дан 5 December 2019 в 06:38
поделиться

Добавьте этот метод в свой пользовательский NSView, и он будет отлично работать с событиями мыши

- (void)mouseUp:(NSEvent*) event {
    NSMenuItem* mitem = [self enclosingMenuItem];
    NSMenu* m = [mitem menu];
    [m cancelTracking];
    [m performActionForItemAtIndex: [m indexOfItem: mitem]];
}

Но у меня возникли проблемы с обработкой ключей, если вы решили эту проблему, возможно, вы можете перейти к моему вопросу и немного помочь мне.

12
ответ дан 5 December 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: