我无法在 iOS 15 的 WidgetConfiguration 中添加 systemExtraLarge 系列

I can't add systemExtraLarge family in WidgetConfiguration for iOS 15

我想在我的应用程序中添加一个超大的小部件作为 iOS 15 的支持系列。

WidgetConfiguration的简化代码如下:

    var body: some WidgetConfiguration {
        IntentConfiguration(
            kind: "Widget",
            intent: SelectProjectIntent.self,
            provider: Provider()
        ) {
            entry in
            ProgressWidgetEntryView(entry: entry)
        }
        .configurationDisplayName("Title")
        .description("Description")
        .supportedFamilies([.systemSmall, .systemMedium, .systemLarge, .systemExtraLarge])
    }

显然我不能简单地添加 extra Large 因为会出现以下错误: 'systemExtraLarge' 仅在 iOS 15.0 或更高版本

的应用程序扩展中可用

但是按照 XCode 的建议进行快速简单的可用性检查,我收到了一个错误和几个警告。这是代码:

    var body: some WidgetConfiguration {
        
        if #available(iOSApplicationExtension 15.0, *) {
            
            IntentConfiguration(
                kind: "Widget",
                intent: SelectProjectIntent.self,
                provider: Provider()
            ) {
                entry in
                ProgressWidgetEntryView(entry: entry)
            }
            .configurationDisplayName("Title")
            .description("Description")
            .supportedFamilies([.systemSmall, .systemMedium, .systemLarge, .systemExtraLarge])
            
        } else {
            
            IntentConfiguration(
                kind: "Widget",
                intent: SelectProjectIntent.self,
                provider: Provider()
            ) {
                entry in
                ProgressWidgetEntryView(entry: entry)
            }
            .configurationDisplayName("Title")
            .description("Description")
            .supportedFamilies([.systemSmall, .systemMedium, .systemLarge])
        }
    }

错误是:函数声明了一个不透明的 return 类型,但在其主体中没有 return 语句可从中推断出基础类型

以及两个警告:调用 'supportedFamilies' 的结果未使用

有人可以向我解释为什么我会收到此错误以及如何修复它以便我可以保留 iOS 14 的小部件并为 iOS 15 添加 systemExtraLarge?

我在 macOS Monterey 版本 12.0 beta (21A5304g) 上使用 XCode 版本 13.0 beta 5

提前致谢。

当您创建视图时,它的 var body 被标记为 @ViewBuilder。这允许您提供多个子视图并使用条件 (learn more)。不幸的是,这对 Widget 的主体不起作用,因为没有 WidgetConfigurationBuilder 这样的东西,所以您只能 return 来自 Widget 的 body 的单个 WidgetConfiguration。

要解决您的问题,请从 Widget 的 body 中取出 if-else。一种方法是将其移动到 属性,如下所示:

struct MyWidget: Widget {
    
    private let supportedFamilies:[WidgetFamily] = {
        if #available(iOSApplicationExtension 15.0, *) {
            return [.systemSmall, .systemMedium, .systemLarge, .systemExtraLarge]
        } else {
            return [.systemSmall, .systemMedium, .systemLarge]
        }
    }()
    
    var body: some WidgetConfiguration {
        IntentConfiguration(
            kind: "Widget",
            intent: SelectProjectIntent.self,
            provider: Provider()
        ) {
            entry in
            ProgressWidgetEntryView(entry: entry)
        }
        .configurationDisplayName("Title")
        .description("Description")
        .supportedFamilies(supportedFamilies)
    }
}