参数化的应用程序意图如何显示“折叠后”更多参数?

8

我正在使用App Intents框架为我的iOS16应用程序添加App Intents。

其中一个意图是打开我的应用程序数据库中所有事件的列表视图。 应用程序中的视图有许多可用的过滤器,我正在尝试在意图中复制其中一些过滤器。

我已经编写了几个选项 - 一个 AppEnum 显示时间范围(过去/未来/所有事件),以及一种出版物选择器(每个事件可以有零个或一个出版物)。

遵循WWDC2022会议中演示的技术Dive Into App Intents,我已经实现了这一点:

struct OpenEventsList: AppIntent {
    static var title: LocalizedStringResource = "Open Events List"
    static var openAppWhenRun: Bool = true

    @Parameter(title: "Scope")
    var scope: TimeScope

    @Parameter(title: "Publication")
    var publication: PublicationEntity?

    static var parameterSummary: some ParameterSummary {
        Summary("Open \(\.$scope) for \(\.$publication)")
    }

    @MainActor
    func perform() async throws -> some IntentResult {
        // implementation omitted
    }
}

这将生成一个可用的快捷方式操作:

填充参数的示例快捷方式操作

在WWDC演讲中,演讲者说:

你还可以定义哪些参数显示在折叠下面,哪些参数隐藏。这些API可以做一些很酷的事情,例如根据您意图的任何参数的实际值使用When和Otherwise API或Switch、Case和Default API来变化摘要。

...但我找不到任何解释这些API的地方。苹果的文档列出了一些涉及的协议,但仅此而已。

我想把发布选项移到折叠下面,以便默认参数摘要仅包括基于时间的选项,并且如果操作框展开,则显示发布选项(以及我稍后可能添加的其他选项)。


我相信你必须给它一些选项来让它工作。意图推断出你想让它做什么,所以如果你没有给它超过一个选项来使用,它就不会往下执行。 - xTwisteDx
1个回答

11
这个Booky示例项目非常适用于实现AppIntents。你可以在这里找到一个你想要做的示例:AddBook.swift (L43-L48)
因此,您需要通过在括号内添加参数关键路径将ParameterSummary转换为ParameterSummaryBuilder
static var parameterSummary: some ParameterSummary {
    Summary("Open \(\.$scope)") {
        \.$publication
        // you can add as many as you want
    }
}

另一个实现过滤的好方法是通过EntityPropertyQuery。它会自动创建一个名为Find <entity name>的快捷方式,可以应用所有这些过滤和排序,并返回一个AppEntities列表,您可以对其进行操作。
如果您想看一个在生产中使用的示例,在Lunar(一个用于控制监视器的应用)中,我实现了一个更复杂的屏幕查询,您可以在这里找到:alin23/Lunar at LunarShortcuts.swift (L150-L385) 下面是Shortcuts.app生成的屏幕截图: screenshot of Shortcuts app showing the Find Screen action implemented in Lunar

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