如何在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
相关产品推荐
相关产品推荐

