Есть ли способ управления элементом NSMenuItem, который изначально выделяется при открытии меню? - PullRequest
12 голосов
/ 23 апреля 2011

Я работаю над деталями всплывающей кнопки с символами, аналогично тому, как Xcode 3 вверху окна редактора.

Мой объект контроллера является делегатом NSMenu, который показанкогда отображается NSPopUpButton.Я реализую два метода numberOfItemsInMenu: и menu:updateItem:atIndex:shouldCancel: для заполнения меню непосредственно перед его отображением.

Однако заголовок и изображение выбранного NSMenuItem должны меняться каждый раз, когда пользователь меняетвыделение в редакторе NSTextView или внесение изменений в текст;как и в случае с Xcode.

Проблема, с которой я столкнулся, заключается в том, что пользователь нажимает на NSPopUpButton, чтобы отобразить NSMenu, выбранный NSMenuItem и элемент, который должен бытьвыбранные не совпадают, так как в меню еще нет нужного количества элементов.

Мне интересно, есть ли способ контролировать, какой NSMenuItem изначально подсвечивается и отслеживается, когда пользователь нажимаетоткрыть меню.Как есть, первый элемент, который он всегда выделяет и отслеживает, или, если пользователь ранее выбирал элемент, этот элемент выделяется и отслеживается.

Я попытался объяснить, как мог, но вот изображение, иллюстрирующеемоя проблема:

http://imgur.com/izGvh

Я хочу, чтобы выделенный элемент совпадал с выбранным элементом, когда пользователь открывает меню.Есть идеи?

Ответы [ 5 ]

1 голос
/ 27 июня 2013

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

[mMenuItemOne setTag : 1];
[mMenuItemTwo setTag : 2];
[mMenuItemThree setTag : 3];
[mMenuItemFour setTag : 4];}

мы можем выбрать любой элемент меню, используя [_popUp selectItemWithTag: _selectedItem];

1 голос
/ 10 ноября 2012

Я бы использовал кнопку NSPopupupton - она ​​может делать то, что вы хотите.может ты вообще это скрываешь?

0 голосов
/ 01 апреля 2014

Я не уверен, вы хотите переместить выделение мыши (синий цвет) или галочку?

В общем, галочка - это то, что вы хотите изменить.Вы можете сделать это с помощью метода validateMenuItem: (или в любое другое время, если ваш элемент настроен не участвовать в проверке) с помощью метода -setState:.

Голубое выделение является индикатором пользователя.ввод с клавиатуры или расположение мыши, и вы не должны связываться с ним.Изменение его не имеет никакого смысла, так как оно будет изменено назад, как только пользователь перемещает мышь даже на один пиксель.

При этом вы можете установить selectedItemNSPopUpButton, что приведет к перемещению всего меню, так что selectedItem находится под мышью (при условии, что мышь просто нажала всплывающую кнопку).

Если ваш метод делегата меню вызывается после всплывающего окнаКнопка решила, какой элемент выбрать, вы не можете его использовать.Вместо этого вы, вероятно, могли бы установить selectedItem и меню всплывающей кнопки из обработчика NSPopUpButtonWillPopUpNotification.

Если это также вызывается слишком поздно, вам, вероятно, придется создать подкласс NSPopupButtonCell и сделать этов переопределении -attachPopUpWithFrame:inView: (я думаю, что это место, которое также должно работать, когда вы не нажимаете и просто нажимаете клавишу пробела, когда выбрана всплывающая кнопка).

0 голосов
/ 26 октября 2012

Просто подсказка, а не полное решение.

Попробуйте опубликовать событие NSMouseMoved в своем приложении сразу после показанного меню. Основная проблема заключается в том, чтобы определить положение элемента, который вы хотите выделить. Просто отправная точка.

0 голосов
/ 17 октября 2012

Вы пробовали этот NSMenuDelegate метод: Обработка выделения

– menu:willHighlightItem:

Ссылка на протокол NSMenuDelegate

Также вы можете сохранить индекс NSMenuItem в некоторой переменной, чтобы отслеживать выбранный элемент для дальнейшего использования.

...