返回

iOS 14 中的 UIMenu:功能增强和灵活性的提升

IOS

在 iOS 13 中首次亮相的 UIMenu 控件,使开发者能够轻松创建程序菜单和上下文菜单,从而为应用程序添加直观的交互功能。iOS 14 将 UIMenu 提升到了一个新的高度,引入了 UIDeferredMenuElement,实现了异步菜单创建,并显著提升了菜单配置的灵活性。

异步菜单的威力:UIDeferredMenuElement

过去,UIMenu 的内容必须在菜单创建时就指定好。这对于简单的菜单来说不成问题,但对于需要动态加载或从远程服务获取内容的复杂菜单来说,就会遇到局限性。

UIDeferredMenuElement 解决了这一限制,它允许您在菜单创建后异步地添加菜单项。这使您可以延迟菜单的配置,直到获得必要的数据或完成后台操作。

动态菜单的无限可能

UIDeferredMenuElement 的引入为应用程序菜单开启了无限的可能性。以下是一些利用异步菜单配置的示例:

  • 基于用户输入的动态菜单: 您可以根据用户的输入动态地构建菜单选项,例如在搜索栏中输入的文本或选定的表项。
  • 远程数据驱动的菜单: 您可以从远程服务(如 API)中获取菜单选项,并在用户需要时动态加载它们。这对于保持菜单内容的最新和相关性至关重要。
  • 复杂的操作延迟: 某些菜单项可能涉及复杂的操作或计算,可以通过异步方式执行这些操作,而不影响菜单的显示和交互性。

使用 UIDeferredMenuElement 的步骤

使用 UIDeferredMenuElement 创建异步菜单非常简单:

  1. 创建一个新的 UIMenu 对象。
  2. 创建一个或多个 UIDeferredMenuElement 对象。
  3. 将 UIDeferredMenuElement 对象添加到 UIMenu 中。
  4. 在异步回调中,为 UIDeferredMenuElement 配置菜单项。

具体实现示例:

import UIKit

// 创建一个新的 UIMenu 对象
let menu = UIMenu()

// 创建一个 UIDeferredMenuElement 对象
let deferredElement = UIDeferredMenuElement(options: .displayInline)

// 将 UIDeferredMenuElement 对象添加到 UIMenu 中
menu.items.append(deferredElement)

// 在异步回调中,为 UIDeferredMenuElement 配置菜单项
deferredElement.completion = { [weak deferredElement] in
    // 从远程服务获取菜单选项
    let options = ["选项 1", "选项 2", "选项 3"]
    
    // 将菜单选项添加到 UIDeferredMenuElement 中
    for option in options {
        deferredElement?.children.append(UIMenu(title: option, image: nil, identifier: nil, options: .displayInline))
    }
}

总结

iOS 14 中的 UIMenu,通过引入了 UIDeferredMenuElement,获得了显着的提升。异步菜单配置的能力为应用程序菜单带来了无限的可能性,使开发者能够创建更动态、更灵活和更个性化的交互体验。利用 UIDeferredMenuElement,您可以实现基于用户输入的菜单、从远程服务加载菜单选项,以及延迟复杂的菜单操作。通过拥抱 UIMenu 的增强功能,您将能够提升应用程序的可用性和用户体验,并为用户提供更加直观和顺畅的交互。