文档说:“要使用主菜单系统在菜单栏中添加和删除菜单,请在应用程序委托中重写 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
函数。唯一显示的项目是三个缩放功能。此外,在运行应用程序时,如果我长按命令按钮,我会看到一个带有缩放功能的上下文菜单。
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];
}