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

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

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

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

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

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

【问题讨论】:

    标签: ios ios14 uimenu


    【解决方案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 提交增强请求。

    【讨论】:

    • 谢谢。在用户按下按钮后,我的应用程序中的上下文可能会发生变化,因此必须在那时捕获它。我想唯一的解决方案就是那个自定义视图。
    猜你喜欢
    • 2016-01-13
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多