我正在研究符号弹出按钮的细节,类似于编辑器窗口顶部的Xcode 3。
我的控制器对象是显示NSMenu
时显示的NSPopUpButton
的委托。我实现了两个方法numberOfItemsInMenu:
和menu:updateItem:atIndex:shouldCancel:
,以便在即将显示之前填充菜单。
但是,每次用户更改编辑器NSMenuItem
中的选择时,所选NSTextView
的标题和图片都必须更改,或者对文字进行更改;就像Xcode一样。
我遇到的问题是当用户点击NSPopUpButton
以显示NSMenu
时,所选的NSMenuItem
和应该选择的项目不匹配,因为菜单还没有适当数量的项目。
我想知道是否有办法控制用户点击打开菜单时最初突出显示和跟踪的NSMenuItem
。目前,它始终突出显示和跟踪的第一个项目,或者,如果用户之前选择了一个项目,则突出显示并跟踪该项目。
我尽力解释,但这是一张说明我问题的图片:
当用户打开菜单时,我希望突出显示的项目与所选项目相同。有什么想法吗?
答案 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
时这样做(我认为这是你不应该工作的地方)单击并在选中弹出按钮时单击空格键。