由于 iOS14 提供了一种在 上设置菜单的简单方法UIBarButtonItem
,我想知道我是否错过了设置其项目的简单方法,因为它们可能取决于当前上下文。
我看到有UIDeferredMenuElement
,但这似乎不是一个好的用例?
我也看到有primaryAction
,但似乎没有一种简单的方法可以从那里调用菜单。
第三个选项似乎是在可能影响它的每个更改上重新调整菜单,但这似乎不是一个好主意。
我假设我错过了一些东西。
基本上对于一个简单的栏按钮项目没有这样的规定。像 UIButton 这样的 UIControl 有一个事件.menuActionTriggered
,此时构造菜单并将其分配给控件是完全合理的,从而实现了在菜单出现之前的瞬间构造的动态菜单。
但是你不能用一个条形按钮项来做到这一点——除非它是一个带有 UIButton 的自定义视图条形按钮项。
否则,您必须做的是通过其他一些机制观察周围的条件,并且每次条件发生变化时只需更改条形按钮项目的菜单。这听起来很痛苦,但它可能是你唯一的选择。(我认为这正是您所说的“第三个选项似乎是对可能影响它的每个更改的菜单进行重新洗牌,但这似乎不是一个好主意。”)
我认为您的要求是合理的,没有任何规定似乎有点愚蠢;如果您有一个好的用例,我建议您向 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) {
...
}
这是迄今为止唯一的解决方案。Asfunc pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?)
不会每次都调用,除非您在按钮设置为 时按住一段时间showsMenuAsPrimaryAction = true
。
----编辑----
如果我的答案是正确的,那么马特的。因为我的代码是基于他的想法。所以我一开始并不认为马特是错的。我只是认为提问者对马特的回答有误解。