You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在iOS 16锁屏添加多个accessoryCircular小组件?

解决iOS 16锁屏圆形小组件仅显示一个的问题

你的问题出在switch语句的分支逻辑上——同一个case .accessoryCircular写了三次,switch会在匹配到第一个符合条件的分支后立即停止执行,所以后面两个圆形小组件的视图永远不会被渲染。

要实现多个独立的锁屏圆形小组件,不能在同一个Widget视图里用重复的case分支,而是需要通过定义多个独立的Widget实例来实现,每个实例对应一个圆形小组件:

1. 修改Widget Bundle配置

用WidgetBundle来打包多个Widget,让系统识别出不同的小组件选项:

@main
struct PlaneCalcWidgets: WidgetBundle {
    var body: some Widget {
        // 原有的主小组件(包含普通大小和矩形锁屏组件)
        PlaneCalcMainWidget()
        // 质量圆形小组件
        MassCircularWidget()
        // 乘客圆形小组件
        PaxCircularWidget()
    }
}

2. 拆分独立的Widget结构体

为每个圆形小组件创建单独的Widget结构体,指定唯一的kind标识符和支持的组件类型:

// 主小组件(保留原有普通尺寸和矩形锁屏组件)
struct PlaneCalcMainWidget: Widget {
    let kind: String = "com.yourdomain.PlaneCalc.Main"

    var body: some WidgetConfiguration {
        StaticConfiguration(kind: kind, provider: WidgetProvider()) { entry in
            PlaneCalcWidgetView(entry: entry)
        }
        .configurationDisplayName("计算器主组件")
        .description("显示核心计算数据")
        .supportedFamilies([.systemSmall, .systemMedium, .systemLarge, .accessoryRectangular])
    }
}

// 质量圆形小组件
struct MassCircularWidget: Widget {
    let kind: String = "com.yourdomain.PlaneCalc.Mass"

    var body: some WidgetConfiguration {
        StaticConfiguration(kind: kind, provider: WidgetProvider()) { entry in
            gaugeMassCircularWidget(entry: entry)
        }
        .configurationDisplayName("质量监测")
        .description("实时显示质量数据")
        .supportedFamilies([.accessoryCircular])
    }
}

// 乘客圆形小组件
struct PaxCircularWidget: Widget {
    let kind: String = "com.yourdomain.PlaneCalc.Pax"

    var body: some WidgetConfiguration {
        StaticConfiguration(kind: kind, provider: WidgetProvider()) { entry in
            gaugePaxCircularWidget(entry: entry)
        }
        .configurationDisplayName("乘客统计")
        .description("实时显示乘客数据")
        .supportedFamilies([.accessoryCircular])
    }
}

3. 清理原视图的重复分支

修改PlaneCalcWidgetView,移除重复的.accessoryCircular分支(因为圆形组件已经由独立的Widget处理):

struct PlaneCalcWidgetView: View {
    @Environment(.widgetFamily) var size
    var entry: WidgetProvider.Entry

    var body: some View {
        if #available(iOSApplicationExtension 16.0, *) {
            switch size {
            case .systemSmall:
                SmallWidgetView(entry: entry)
            case .systemMedium:
                MediumWidgetView(entry: entry)
            case .systemLarge:
                LargeWidgetView(entry: entry)
            case .accessoryRectangular:
                gaugeLinearWeatherWidget(entry: entry)
            @unknown default:
                Text("Unknown")
            }
        } else {
            switch size {
            case .systemSmall:
                SmallWidgetView(entry: entry)
            case .systemMedium:
                MediumWidgetView(entry: entry)
            case .systemLarge:
                LargeWidgetView(entry: entry)
            @unknown default:
                Text("Unknown")
            }
        }
    }
}

这样处理后,用户在添加锁屏组件时,就能看到三个独立的圆形小组件选项,分别对应你写的三个视图,添加后就能同时显示在锁屏上了。

内容的提问来源于stack exchange,提问作者user19715684

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:10:36