ios 如何有条件地显示UIMenu或UIBarButtonItem中的警报?

iibxawm4  于 2023-06-25  发布在  iOS
关注(0)|答案(1)|浏览(131)

我想从UIBarButtonItem显示一个菜单,但只有当点击按钮时运行时检查成功,否则显示一个警报。
快速背景。我有一些旧的代码(在UIMenu之前),用一个目标/操作来处理UIBarButtonItem,该目标/操作将执行检查,然后显示一个警报或呈现一个操作表。
我正在尝试更新该代码以使用UIMenu而不是操作表(UIAlertController)。我知道如何用UIMenu创建UIBarButtonItem。这很容易实现。
我在SO上的任何API或任何搜索中都找不到的是如何手动显示UIMenu
下面是我的代码的一个粗略示例,它直接显示了UIBarButtonItem中的菜单:

btnAdd = UIBarButtonItem(systemItem: .add, menu: UIMenu(children: [
    // An array of UIAction instances for each menu item
]))

该代码工作得很好,但我需要更改它,使菜单只出现在正确的条件下。我正在考虑类似于下面的内容,但我不知道如何编写手动显示UIMenu的代码行。

btnAdd = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addAction))

...

@objc func addAction(_ sender: UIBarButtonItem) {
    if someRuntimeCondition == true {
        let menu = UIMenu(children: [
            // An array of UIAction instances for each menu item
        ])

        ??? // How to display menu from sender?
    } else {
        // Create and display an alert
    }
}

我觉得我错过了一些简单而明显的东西,但我就是看不出来。
我已经查看了UIMenuUIBarButtonItemUIContextMenuInteractionUIMenuController的文档(已弃用)。这些似乎都没有提供从UIBarButtonItem手动显示菜单的方法。我还看了几个苹果的示例应用程序。
任何解决方案都需要与iOS 15.0+配合使用。

cgvd09ve

cgvd09ve1#

当我发现了一个使用UIDeferredMenuElement.uncached的棘手解决方案时,我离点击提交我的问题只有几秒钟。这并没有回答如何从UIBarButtonItem手动显示UIMenu的问题,但这确实实现了我的最终目标,即当点击UIBarButtonItem时,有条件地显示警报或菜单。

btnAdd = UIBarButtonItem(systemItem: .add, menu: UIMenu(children: [
    UIDeferredMenuElement.uncached({ [weak self] completion in
        if someRuntimeCondition == true {
            completion([]) // send back an empty list of menu items
            // Show UIAlertController
        } else {
            let children = [
                // An array of UIAction instances for each menu item
            ]
            completion(children) // send back the proper menu items
        }
    })
]))

相关问题