iOS 14增加了在点击或长按UIBarButtonItem或UIButton时显示菜单的功能,如下所示:
let menu = UIMenu(children: [UIAction(title: "Action", image: nil) { action in
//do something
}])
button.menu = menu
barButtonItem = UIBarButtonItem(title: "Show Menu", image: nil, primaryAction: nil, menu: menu)这通常会取代行动单(UIAlertController使用actionSheet
样式)。有一个动态的动作表是很常见的,其中只包含动作,或者可能会根据用户点击按钮时的某些状态禁用动作。但使用此API时,菜单是在创建按钮时创建的。如何在菜单显示之前对其进行修改,或以其他方式使其动态,以确保适当的操作可用,并在其出现时处于正确的状态?
发布于 2020-07-19 01:33:37
我发现的一种解决方案是存储对您的栏、按钮、项目或按钮的引用,并在每次发生影响菜单中可用操作的任何状态更改时重新创建菜单。menu
是可设置的属性,因此可以在创建按钮后随时更改它。您还可以获取当前菜单并替换其子菜单,如下所示:
button.menu = button.menu?.replacingChildren([])
对于状态更改时没有通知您的情况,您确实需要能够在菜单出现之前更新它。对于UIButton,您可以在用户通过目标/操作按下按钮时更改菜单,如下所示:
button.addTarget(self, action: #selector(buttonTouchedDown(_:)), for: .touchDown)
。我确认这至少可以在iOS 14测试版中工作,但前提是
showsMenuAsPrimaryAction是假的,所以他们必须长按才能打开菜单。我还没有找到UIBarButtonItem的解决方案,但是您可以使用UIButton作为UIBarButtonItem的自定义视图。
这些不像是很好的解决方案,如果我找到更好的解决方案就会更新。
发布于 2021-02-25 22:38:35
经过一些试验,我发现您可以修改UIButtons.menu通过设置
menu属性设置为null首先设置新的UIIMenu下面是我编写的示例代码
@IBOutlet weak var button: UIButton!
func generateMenu(max: Int, isRandom: Bool = false) -> UIMenu {
let n = isRandom ? Int.random(in: 1...max) : max
print("GENERATED MENU: \(n)")
let items = (0.. UIAction in
UIAction(
title: "Menu \(i)",
image: nil
) {[weak self] _ in
guard let self = self else { return }
self.button.menu = nil // HERE
self.button.menu = self.generateMenu(max: 10, isRandom: true)
print("Tap")
}
}
let m = UIMenu(
title: "Test", image: nil,
identifier: UIMenu.Identifier(rawValue: "Hello.menu"),
options: .displayInline, children: items)
return m
}
override func viewDidLoad() {
super.viewDidLoad()
button.menu = generateMenu(max: 10)
button.showsMenuAsPrimaryAction = true
}https://stackoverflow.com/questions/62970548
复制相似问题