UIMenuBuilder 菜单栏与上下文菜单

问题描述 投票:0回答:1

文档说:“要使用主菜单系统在菜单栏中添加和删除菜单,请在应用程序委托中重写 buildMenu(with:) 。要使用上下文系统构建上下文菜单,请重写视图中的方法控制器。”

但是,我没有看到这种行为。我用于构建菜单的所有菜单代码都在应用程序委托中。我有多个使用

insertSibling()

 的实例,只有一种情况是我从头开始构建菜单:

let zoomInCommand = UIKeyCommand(title: NSLocalizedString("Zoom In", comment: ""), image: nil, action: #selector(ViewController.zoomIn), input: "+", modifierFlags: .command) let zoomOutCommand = UIKeyCommand(title: NSLocalizedString("Zoom Out", comment: ""), image: nil, action: #selector(ViewController.zoomOut), input: "-", modifierFlags: .command) let zoomCancelCommand = UIKeyCommand(title: NSLocalizedString("Reset Zoom", comment: ""), image: nil, action: #selector(ViewController.zoomCancel), input: "0", modifierFlags: .command) let zoomMenu = UIMenu(title:"Zoom", identifier: UIMenu.Identifier("Zoom"), options:.displayInline ,children: [zoomInCommand,zoomOutCommand,zoomCancelCommand]) builder.insertChild(zoomMenu, atEndOfMenu: .view)
注意:这个 ZoomMenu 也像其他项目一样内置在应用程序委托中。这是我提到的 

insertSibling()

 函数的示例。

let saveProjectCommand = UIKeyCommand(title: NSLocalizedString("Save Project", comment: ""), image: nil, action: #selector(ViewController.saveProjectAndShowActivityIndicator), input: "p", modifierFlags: .command) let saveImageCommand = UIKeyCommand(title: NSLocalizedString("Save Image", comment: ""), image: nil, action: #selector(ViewController.saveImageAction), input: "i", modifierFlags: .command) let saveSVGCommand = UIKeyCommand(title: NSLocalizedString("Save SVG File", comment: ""), image: nil, action: #selector(ViewController.saveSVG), input: "g", modifierFlags: .command) let saveMenu = UIMenu(title:"Save",identifier: UIMenu.Identifier(rawValue: "Save"),children: [saveProjectCommand,saveSVGCommand,saveImageCommand]) builder.insertSibling(saveMenu, beforeMenu: .close)
在我的视图控制器中,我使用 

validate

 函数。唯一显示的项目是三个缩放功能。此外,在运行应用程序时,如果我长按命令按钮,我会看到一个带有缩放功能的上下文菜单。
根据文档,由于我在应用程序委托中定义了缩放功能,因此它不应该出现在视图控制器中,但它确实出现了。另外,如果出现缩放菜单,为什么不出现保存菜单?

ios swift ipad uimenubuilder
1个回答
0
投票
这里的文档有点令人困惑,因为似乎在应用程序委托上为

all

 菜单调用了 
buildMenuWithBuilder。因此,它不仅在构建系统菜单时触发,还在上下文菜单中触发。通常,上下文菜单不需要通过委托进行编辑,因为它们无论如何都是从头开始构建的。

对于应用程序委托中的

buildMenuWithBuilder

 实现,您可能希望忽略任何不适用于 
mainSystem
 的构建器(其中将包括上下文菜单)。为此,请检查构建器的系统属性,如果类型不正确则返回。

斯威夫特:

func buildMenu(with builder: UIMenuBuilder) { // return if not the main system menu guard builder.system == UIMenuSystem.mainSystem else { return } // menu building code... builder.removeMenu(for: UIMenu.Identifier.file) }
目标C

- (void)buildMenuWithBuilder:(id<UIMenuBuilder>)builder { // return if not the main system menu if ([builder system] != [UIMenuSystem mainSystem]) { return; } // menu building code... [builder removeMenuForIdentifier:UIMenuFile]; }
    
© www.soinside.com 2019 - 2024. All rights reserved.