4

由于 iOS14 提供了一种在 上设置菜单的简单方法UIBarButtonItem,我想知道我是否错过了设置其项目的简单方法,因为它们可能取决于当前上下文。

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

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

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

我假设我错过了一些东西。

4

2 回答 2

2

基本上对于一个简单的栏按钮项目没有这样的规定。像 UIButton 这样的 UIControl 有一个事件.menuActionTriggered,此时构造菜单并将其分配给控件是完全合理的,从而实现了在菜单出现之前的瞬间构造的动态菜单。

但是你不能用一个条形按钮项来做到这一点——除非它是一个带有 UIButton 的自定义视图条形按钮项。

否则,您必须做的是通过其他一些机制观察周围的条件,并且每次条件发生变化时只需更改条形按钮项目的菜单。这听起来很痛苦,但它可能是你唯一的选择。(我认为这正是您所说的“第三个选项似乎是对可能影响它的每个更改的菜单进行重新洗牌,但这似乎不是一个好主意。”)

我认为您的要求是合理的,没有任何规定似乎有点愚蠢;如果您有一个好的用例,我建议您向 Apple 提交增强请求。

于 2020-08-19T16:29:12.863 回答
-1

这是 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

----编辑----

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

于 2021-04-28T18:00:29.343 回答