iOS 14在打开UIBarButtonItem菜单之前设置它

4
作为 iOS14 提供了一种在 UIBarButtonItem 上设置菜单的简单方式,我想知道是否错过了设置其项目的简单方法,因为它们可能取决于当前上下文。
我看到了 UIDeferredMenuElement,但这似乎不是一个好的用例?
此外,我看到有 primaryAction,但似乎没有一种简单的方法从那里调用菜单。
第三个选项似乎是在每次可能影响菜单的更改时重新排列菜单,但这似乎不是一个好主意。
我假设我错过了某些东西。
2个回答

2
基本上对于简单的工具栏按钮,没有这样的功能。像UIButton这样的UIControl有一个事件.menuActionTriggered,在那个时刻,构造并分配菜单到控件是完全合理的,从而实现在菜单出现之前刚刚构建的动态菜单。
但是你不能这样做一个工具栏按钮项——除非它是一个带有UIButton的自定义视图工具栏按钮项。
否则,你需要通过一些其他机制监视周围的条件,并在每次条件改变时更改工具栏按钮项的菜单。这听起来很麻烦,但这可能是你唯一的选择。(我想当你说“第三个选项似乎是在每次可能影响它的更改时重新整理菜单,但这似乎不是一个好主意”的时候,你就是这个意思。)
我认为你所要求的是合理的,而且似乎很傻,没有这样的规定;如果你有一个好的用例,我建议向苹果提出增强请求。

谢谢。还有其他问题,比如用户按下按钮后应用程序中的上下文可能会发生变化,因此必须在那一刻捕获它。我想唯一的解决方案就是使用自定义视图。 - Ivan Ičin

0

这是受 @matt 答案启发的 Swift 5 版本实现。

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并长时间按住时才会被调用。

----编辑----

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


起初我投了反对票,因为Matt的答案基本上是除了在操作之前更改菜单之外没有其他答案。所以你的答案可能是正确的,但肯定需要更好的描述。确认一下,它是否显示用户点击按钮时定制的菜单?此外,如果您编辑答案,网站将不允许我取消反对票。 - Ivan Ičin
你之前提供的解释是错误的。我已经尝试解释为什么我会投反对票(有理由),以及为什么我在技术上无法更改我的反对票,如果你觉得抱怨这一点是没有意义的。 - Ivan Ičin
但我确实接受了你的答案,只是除非你编辑它,否则我无法点赞。我强烈建议你删除对Matt答案的引用,因为它表达了不同的意思。 - Ivan Ičin
我不认为马特是错的。我认为你误解了。 - Owen Zhao
无论如何,如果你是正确的,那么他就是错的,因为他说这是不可能的,需要提交给苹果作为改进请求。所以要么你错了,要么他错了。 - Ivan Ičin
抱歉,你的回答并不正确,因为你明显没有注意到我在谈论UIBarButtonItem,所以你的回答并没有涉及它。 - Ivan Ičin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接