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

Posted

技术标签:

【中文标题】iOS 14 在打开之前设置 UIBarButtonItem 菜单【英文标题】:iOS 14 setup the UIBarButttonItem menu before it is opened 【发布时间】:2020-12-08 21:35:36 【问题描述】:

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

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

我还看到有primaryAction,但似乎没有从那里调用菜单的简单方法。

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

我认为我错过了一些东西。

【问题讨论】:

【参考方案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) 
    ...

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

----已编辑----

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

【讨论】:

起初我投了反对票,因为马特的回答基本上是除了在行动前更改菜单之外没有其他答案。所以你的答案甚至可能是正确的,但它肯定需要更好的描述。要确认它是否显示用户点击按钮时自定义的菜单?此外,除非您编辑答案,否则我无法投反对票,因为该网站不允许这样做。 您提供了错误的解释,如上所述。我试图解释为什么我投了反对票(这是有原因的)以及为什么我不能从技术上改变我的反对票,如果你想抱怨这是不明智的。 但是我确实接受了您的回答,只是除非您对其进行编辑,否则我无法投票。我当然建议您删除对马特答案的引用,因为它说明了一些不同的内容。 我认为马特没有错。我以为你误会了。 随便。如果你是对的,那么他就错了,因为他说这是不可能的,需要提交给苹果公司作为改进请求。所以要么你错了,要么他错了。【参考方案2】:

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

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

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

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

【讨论】:

谢谢。在用户按下按钮后,我的应用程序中的上下文可能会发生变化,因此必须在那时捕获它。我想唯一的解决方案就是那个自定义视图。

以上是关于iOS 14 在打开之前设置 UIBarButtonItem 菜单的主要内容,如果未能解决你的问题,请参考以下文章

iOS 14 并未移除 3D Touch 功能,苹果官方:暂时不可用

iOS 14.3正式版发布,我先升为敬!

iOS 14.3正式版发布,我先升为敬!

iOS 14.3准正式版发布,更新了这些!

iOS 14.3准正式版发布,更新了这些!

苹果ios14小组件在哪里设置