Подтвердить что ты не робот

Есть ли способ контролировать элемент NSMenuItem, который изначально выделяется при открытии меню?

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

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

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

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

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

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

http://imgur.com/izGvh

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

4b9b3361

Ответ 1

Я бы использовал NSPopupbutton - он может делать то, что вы хотите. может быть, вы даже спрятали его?

Ответ 2

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

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

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

Ответ 3

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

– menu:willHighlightItem:

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

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

Ответ 4

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

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

Ответ 5

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

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

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

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

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

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