微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

iOS 14在打开之前设置UIBarButttonItem菜单

如何解决iOS 14在打开之前设置UIBarButttonItem菜单

由于iOS14提供了一种简便的方法来设置UIBarButtonItem上的菜单,我想知道我没有想到没有简单的方法来设置其菜单项,因为它们可能取决于当前上下文。

我看到有UIDeferredMenuElement,但这似乎不是一个好用例?

我也看到有primaryAction,但是似乎没有一种从那里调用菜单的简单方法

第三个选项似乎是对可能影响它的每次更改重新调整菜单,但这似乎不是一个好主意。

我认为我错过了一些事情。

解决方法

基本上,对于简单的条形按钮项,没有这样的规定。像UIButton这样的UIControl都有一个事件.menuActionTriggered,在那时,构造菜单并将其分配给控件是完全合理的,因此实现了一个动态菜单,该菜单是在菜单出现之前即刻构造的

但是您不能使用条形按钮项来做到这一点-除非它是其中包含UIButton的自定义视图条形按钮项。

否则,您需要做的是通过某种 other 机制观察周围的情况,并在每次条件改变时只需更改bar按钮项目的菜单。听起来像是屁股疼,但这可能是您唯一的选择。 (我想这就是您说的意思,“第三个选项似乎是在每次可能影响它的更改上重新组合菜单,但这似乎不是一个好主意。”)

我认为您的要求是合理的,没有准备金似乎有点可笑;如果您有很好的用例,建议您向Apple提出增强请求。

,

这是 Swift 5 版本的实现,灵感来自 @matt 的答案。

private func setButton() {
    button.menu = UIMenu() // Here must be a placeholder menu. As the menu won't show if button.menu is nil.
    button.showsMenuAsPrimaryAction = true
    button.addTarget(self,action: #selector(createMenu(_:)),for: .menuActionTriggered)
}

@objc private func createMenu(_ button:UIButton) {
    ...
}

这是目前唯一的解决方案。因为 func pressesBegan(_ presses: Set<UIPress>,with event: UIPressesEvent?) 不会每次都调用,除非您在按钮设置为 showsMenuAsPrimaryAction = true 时按住一段时间。

----编辑----

如果我的答案是正确的,那么马特就是如此。因为我的代码是基于他的想法。所以我一开始并不认为马特是错的。我只是觉得提问者对马特的回答有误解。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。