Нажмите NSMenu в OS X

Как я могу определить, когда нажимается меню в строке меню? Я имею в виду, когда что-то нажимается, например, меню «файл», а не конкретная позиция в меню.

Пробовал подключать IBActions из пунктов меню в конструкторе интерфейсов из своего кода, но не получается из пункта главного меню типа "Файл" только из подменю внутри этого меню


person Wojtek    schedule 01.06.2014    source источник


Ответы (2)


Прежде всего, чего вы пытаетесь достичь в целом? Возможно, знать, когда была нажата строка меню, — не лучший подход.

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

person Ken Thomases    schedule 01.06.2014

Перейдите в MainMenu.xib и посмотрите на структуру меню. Это будет что-то вроде

Главное меню

Пункт меню - Файл

Меню - Файл

Щелкните правой кнопкой мыши NSMenu, который вы хотите наблюдать, а не NSMenuItem. прикрепите делегата к объекту или контроллеру по вашему выбору.

Затем реализуйте

- (void)menuWillOpen:(NSMenu *)menu
person lead_the_zeppelin    schedule 01.06.2014
comment
Я уже устал от этого, но это не работает для меня. Что я сделал, так это делегировал владельцу файла, добавил этот метод, но он не запускается. - person Wojtek; 01.06.2014
comment
Я также добавил NSMenuDelegate в файл mile .h - person Wojtek; 01.06.2014
comment
Это сработало для меня. Вы прикрепили делегат NSMenu под названием «Файл»? Вы не можете прикрепить его к главному меню или пункту меню под названием «Файл». - person lead_the_zeppelin; 01.06.2014
comment
Да, я сделал. Я должен прикрепить его к владельцу файла, не так ли? - person Wojtek; 01.06.2014
comment
вы можете подключить его к любому контроллеру, который вы хотите. Обычно я прикреплял его к первому ответившему. Так как это имеет наибольший смысл. - person lead_the_zeppelin; 01.06.2014
comment
Я не думаю, что имеет смысл прикреплять делегатский выход к Первому ответчику. Во-первых, это делегат, а не цель действия. Во-вторых, первый ответчик в основном означает nil. То есть целью элемента управления, который настроен на отправку действия Первому ответчику, является nil. - person Ken Thomases; 01.06.2014
comment
@KenThomases, ты прав. Я думаю, что мог иметь в виду, что имеет смысл реализовать все функции меню в том, что является первым ответчиком. - person lead_the_zeppelin; 01.06.2014