有没有办法控制打开菜单时最初突出显示的NSMenuItem项?

时间:2011-04-23 05:04:01

标签: objective-c cocoa nsmenu

我正在研究符号弹出按钮的细节,类似于编辑器窗口顶部的Xcode 3。

我的控制器对象是显示NSMenu时显示的NSPopUpButton的委托。我实现了两个方法numberOfItemsInMenu:menu:updateItem:atIndex:shouldCancel:,以便在即将显示之前填充菜单。

但是,每次用户更改编辑器NSMenuItem中的选择时,所选NSTextView的标题和图片都必须更改,或者对文字进行更改;就像Xcode一样。

我遇到的问题是当用户点击NSPopUpButton以显示NSMenu时,所选的NSMenuItem和应该选择的项目不匹配,因为菜单还没有适当数量的项目。

我想知道是否有办法控制用户点击打开菜单时最初突出显示和跟踪的NSMenuItem。目前,它始终突出显示和跟踪的第一个项目,或者,如果用户之前选择了一个项目,则突出显示并跟踪该项目。

我尽力解释,但这是一张说明我问题的图片:

http://imgur.com/izGvh

当用户打开菜单时,我希望突出显示的项目与所选项目相同。有什么想法吗?

5 个答案:

答案 0 :(得分:1)

我会使用NSPopup按钮 - 它可以做你想要的。也许你甚至隐藏了它?

答案 1 :(得分:1)

我不是很确定我理解你的问题但是如果我们可以为这些菜单项添加标签。 例如

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

我们可以使用选择任何菜单项     [_popUp selectItemWithTag:_selectedItem];

答案 2 :(得分:0)

您是否尝试过此NSMenuDelegate方法:处理突出显示

– menu:willHighlightItem:

NSMenuDelegate Protocol Reference

此外,您可以将NSMenuItem索引存储在某些var中,以跟踪所选项目以供日后使用。

答案 3 :(得分:0)

只是提示不是一个完整的解决方案。

尝试在显示的菜单后立即将NSMouseMoved事件发布到您的应用。 主要问题是检测要突出显示的项目的位置。 只是一个起点。

答案 4 :(得分:0)

我不确定,你想移动鼠标选择高亮(蓝色的东西)还是勾选标记?

通常,复选标记是您要更改的内容。您可以使用validateMenuItem:方法(或在任何其他时间,如果您的项目设置为不参与验证)使用-setState:方法执行此操作。

蓝色突出显示是用户键盘输入或鼠标位置的指示,您不应该弄乱它。改变它没有任何意义,因为它会在用户移动鼠标甚至单个像素时改变。

也就是说,可以设置selectedItem的{​​{1}},这会导致整个菜单被移动,因此NSPopUpButton位于鼠标下方(假设鼠标只是点击了弹出按钮)。

如果在弹出按钮确定要选择的项目后调用菜单委托方法,则无法使用它。相反,您可以从selectedItem处理程序设置弹出按钮的selectedItem和菜单。

如果这也被称为太晚了,你可能必须继承NSPopUpButtonWillPopUpNotification并在覆盖NSPopupButtonCell时这样做(我认为这是你不应该工作的地方)单击并在选中弹出按钮时单击空格键。