OS X API:定义管理应用程序菜单的对象的类
如何使用 objc2 将 Rust 函数作为选择器传递到 NSMenuItem.action 中?
我有下一个代码来在AppDelegate中构建应用程序菜单(AppDelegate代码取自官方示例): 实现 AppDelegate { fn new(mtm:MainThreadMarker,菜单:选项 我有下一个代码用于在AppDelegate中构建应用程序菜单(AppDelegate代码取自官方示例): impl AppDelegate { fn new(mtm: MainThreadMarker, menu: Option<Menu>) -> Id<Self> { let this = mtm.alloc(); let this = this.set_ivars(Ivars { mtm, menu, }); unsafe { msg_send_id![super(this), init] } } fn build_menu(&self, menu: &Menu, ns_menu: &Id<NSMenu>) { let ivars = self.ivars(); for item in menu.items.iter() { let ns_menu_item = NSMenuItem::new(ivars.mtm); let title = NSString::from_str(&item.name); unsafe { ns_menu_item.setTitle(&title) }; if let Some(on_click) = &item.on_click { unsafe { ns_menu_item.setAction(Some(on_click)) }; } if let Some(submenu) = &item.submenu { let ns_submenu = NSMenu::new(ivars.mtm); self.build_menu(submenu, &ns_submenu); ns_menu_item.setSubmenu(Some(&ns_submenu)); } ns_menu.addItem(&ns_menu_item); } } fn create_menu(&self, application: Id<NSApplication>) { let ivars = self.ivars(); if let Some(menu) = &ivars.menu { let main_menu = NSMenu::new(ivars.mtm); application.setMainMenu(Some(&main_menu)); self.build_menu(menu, &main_menu); } } } 问题出在这部分代码: if let Some(on_click) = &item.on_click { unsafe { ns_menu_item.setAction(Some(on_click)) }; } on_click: fn()是一个Rust函数,我不知道如何使用objc2将其作为Objective-C选择器传递。 在生成的 AppKit 中,该方法如下所示: #[method(setAction:)] pub unsafe fn setAction(&self, action: Option<Sel>); 我很确定有一种更简单的方法,但是...我已经使用自定义 NSMenuItem 类解决了我的问题: #[derive(Debug)] #[allow(unused)] struct MacMenuItemIvars { action: Option<fn()>, } declare_class!( struct MacMenuItem; unsafe impl ClassType for MacMenuItem { type Super = NSMenuItem; type Mutability = mutability::MainThreadOnly; const NAME: &'static str = "MenuItem"; } impl DeclaredClass for MacMenuItem { type Ivars = MacMenuItemIvars; } unsafe impl MacMenuItem { #[method(callback)] fn __callback(&self) { if let Some(action) = self.ivars().action { action(); } } } unsafe impl NSObjectProtocol for MacMenuItem {} ); impl MacMenuItem { fn new<S>(mtm: MainThreadMarker, title: S, action: Option<fn()>) -> Id<Self> where S: Into<String>, { let this = mtm.alloc(); let this = this.set_ivars(MacMenuItemIvars { action, }); let item: Id<MacMenuItem> = unsafe { msg_send_id![super(this), init] }; let title: String = title.into(); let title = NSString::from_str(&title); unsafe { item.setTitle(&title) }; if action.is_some() { unsafe { item.setTarget(Some(&item)) }; unsafe { item.setAction(Some(sel!(callback))) }; } item } } 必须有一种方法可以使用 Objective-C 块达到相同的结果。不过我没明白怎么办。
我想制作一个自定义弹出菜单,在深色背景上有浅色文本。我知道 NSMenuItem 的 setView: 方法,我可以用它来使每个项目在深色
我想在登录过程成功完成后以及用户注销后更改菜单项的标题。 但如果我登录并检查菜单项的标题,它并没有改变...
我想在 Swift 中获取主 NSMenu 以执行以下代码 NSMenu(title: "ApplicationName").autoenablesItems = false。我不知道插入什么作为标题,因为似乎...
我的 NSMenuItems 上有一个自定义 (SwiftUI) 视图。当我没有子视图时,按钮和水龙头工作正常。但是一旦我添加了一个子菜单,基本项目就会变得没有反应。 我试过设置...
我正在NSMenuItem中使用一个非常简单的自定义视图(仅包含一个只读NSTextField和一个NSSegmentedControl)(使用-setView:方法)。这部分工作正常。这是问题所在:...
我有一个macOS菜单栏应用程序,当用户单击菜单栏中的图标(NSStatusBarButton)时,该应用程序会显示NSMenu。我想实现一个功能,用户可以启用切换以强制使用NSMenu ...
我有一个像这样的标准NSMenu这个菜单是用以下代码创建的:NSMenu * menu = [[NSMenu alloc] init]; NSMenuItem * addMenuItem = [[NSMenuItem alloc] init]; [addMenuItem setTitle:[NSString ...
我不知道如何在NSMenu中设置NSMenuItem的字体/样式。我在NSMenu上尝试了setFont方法,但似乎对菜单项没有任何影响。 NSMenuItem不是...
我正在实现一个自定义的NSToolbarItem,它具有一个按钮和一个下拉菜单,例如Mail。但是,唯一不起作用的是禁用了NSMenuItem。无论我做什么,我都做不到...
我要实现的目标,我正在寻找一种在NSMenuItem中显示标题标签和详细文本标签的方法。最好看起来像这样:标题标签与...
“ Control Click”是否与macOS的“右键单击”相同?
我有一个NSTableView,其中的单元格是NSTextField。我将菜单分配给文本字段。当我右键单击单元格时,应该打开菜单。我的第二次点击等于点击...
为什么我的应用程序仅在菜单项位于AppDelegate中时才能看到菜单项的选择器?
我正在Swift中构建我的第一个macOs应用。我设法将菜单(NSMenu)添加到“菜单栏附加”图标,但是当菜单加载时,每个菜单项都显示为停用。我了解这是...
我已经为我的子类NSMenuItem(位于NSStatusMenu中)添加了一个自定义视图,这意味着默认情况下它不会被蓝色/灰色背景“突出显示”。我通过......实现了这一点
validateMenuItem或menuWillOpen未调用NSMenu
我的Mac应用程序有一个NSMenu,它的委托函数validateMenuItem和menuWillOpen从不被调用。到目前为止,网上的解决方案都没有帮助。看起来我做的一切都是正确的:......
我的应用程序具有默认的“帮助”菜单。我已删除“帮助”条目,并添加了一个支持条目,该条目链接到我网站上的论坛。帮助菜单笔尖看起来像这样:但是一旦我有了应用程序并且......
使用新的“文档”项目创建的“打开最近”菜单有一些非常奇怪的事情。即使在Interface Builder中,它看起来像任何其他菜单,它有一些......
我正在尝试实现一个功能来密码保护我的可可应用程序。所以在我的AppDelegate中,如果在窗口上正确输入了密码,我将通过调用NSApp打开主应用程序窗口...
在我的MacOS X应用程序中,我删除了所有默认菜单项,添加了我自己的。但是在底部的“查看”菜单中,我仍然可以看到“输入全屏”菜单项,而在故事板中则没有这样的菜单项。我有 ...
我在Mac状态栏中有一个NSMenu,在其中我有一堆NSMenuItems和一个自定义视图。在自定义视图中,我有一个NSTextField。我想在菜单时将焦点设置在NSTextField上......