swift 忽略小部件参数默认值

mccptt67  于 2023-09-30  发布在  Swift
关注(0)|答案(2)|浏览(111)

我有一个小部件,它接受两个用户定义的参数:位置和背景。
位置选择器工作得很好,默认为我的LocationQuerydefaultResult指定的值。但是由于某种原因,后台选择器忽略了我的BackgroundQuerydefaultResult,XCode抛出了以下警告:
从LNAction获取AppIntent时出错:AppIntent缺少“background”的参数值。您可能需要在@Parameter的初始化器中设置默认值,或者在Query上使用默认方法。
时间轴中没有AppIntent(for:with:)
为什么它不像位置选择器那样工作?

struct BackgroundQuery: EntityQuery {
    func entities(for identifiers: [String]) ->  [WidgetBackground]  {
        [
            WidgetBackground(id: "Background1"),
            WidgetBackground(id: "Background2")
        ].filter { identifiers.contains($0.id) }
    }
    
    func suggestedEntities() -> [WidgetBackground] {
        [
            WidgetBackground(id: "Background1"),
            WidgetBackground(id: "Background2")
        ]
    }
    
    func defaultResult() -> WidgetBackground {
        return WidgetBackground(id: "Background1")
    }
}

struct WidgetBackground: AppEntity {
    var id: String
    
    static var typeDisplayRepresentation: TypeDisplayRepresentation = "Background"
    static var defaultQuery = BackgroundQuery()
    
    var displayRepresentation: DisplayRepresentation {
        DisplayRepresentation(title: "\(NSLocalizedString(id, comment: "").description)")
    }
    
    init(id: String) {
        self.id = id
    }
}

struct LocationQuery: EntityQuery {
    func entities(for identifiers: [LocationDetail.ID]) async throws -> [LocationDetail] {
        LocationDetail.getAllLocations().filter { identifiers.contains($0.id) }
    }
    
    func suggestedEntities() async throws -> [LocationDetail] {
        LocationDetail.getAllLocations()
    }
    
    func defaultResult() async -> LocationDetail? {
        try? await suggestedEntities().first
    }
}


struct SelectLocationIntent: WidgetConfigurationIntent {
    static var title: LocalizedStringResource = "Avalanche Reports Location"
    static var description = IntentDescription("Select the location of the displayed avalanche reports.")

    @Parameter(title: "Location")
    var locationDetail: LocationDetail
    
    @Parameter(title: "Background")
    var background: WidgetBackground
}
6ojccjat

6ojccjat1#

我不知道你是怎么写LocationQuery的,所以我不知道为什么这会发生在BackgroundQuery而不是LocationQuery上。但是你可以添加类似这样的东西来确保参数默认为你想要的值:

@Parameter(title: "Background", defaultValue: BackgroundQuery.defaultResult())

如果这解决了你的问题,请告诉我。也许还可以共享LocationQuery。

pw9qyyiw

pw9qyyiw2#

回答我自己的问题,因为我终于找到了一个解决方案,它看起来像defaultResult只有当它的返回值是suggestedEntities().first时才能工作,老实说,我不知道为什么它会这样工作,所以我希望有一个更好的答案,它解释了,我会标记为正确。

func defaultResult() -> WidgetBackground? {
    suggestedEntities().first
}

相关问题