首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修改UIBarButtonItem和UIButton的UIMenu

如何修改UIBarButtonItem和UIButton的UIMenu
EN

Stack Overflow用户
提问于 2020-07-18 23:46:27
回答 2查看 2.6K关注 0票数 11

iOS 14增加了在点击或长按UIBarButtonItem或UIButton时显示菜单的功能,如下所示:

代码语言:javascript
复制
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时,菜单是在创建按钮时创建的。如何在菜单显示之前对其进行修改,或以其他方式使其动态,以确保适当的操作可用,并在其出现时处于正确的状态?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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的自定义视图。

这些不像是很好的解决方案,如果我找到更好的解决方案就会更新。

票数 6
EN

Stack Overflow用户

发布于 2021-02-25 22:38:35

经过一些试验,我发现您可以修改UIButtons.menu通过设置

menu属性设置为null首先设置新的UIIMenu下面是我编写的示例代码

代码语言:javascript
复制
@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
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62970548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档