引言
本節作為小組件基礎介紹的最后一個章節,前面都沒有提到如何支持多個小組件,默認新建一個組件Target,就有大中小三個組件。如果你是為已經存在的App開發一個小組件功能,那么可能你不會需要那么多小組件。但是也有的App需要支持很多個小組件,也可能是無限個。
要實現支持多個小組件,需要使用到WidgetBundle,自定義一個WidgetBundle並改變小組件的初始化入口。
默認小組件入口
@main
struct Widget1: Widget {
// 小組件的唯一ID
let kind: String = "Widget1"
var body: some WidgetConfiguration {
// 創建時不勾選 “Include Configuration Intent”,這里使用 StaticConfiguration
StaticConfiguration(kind: kind, provider: Provider()) { entry in
Widget1EntryView(entry: entry) // 小組件UI
}
.supportedFamilies([.systemSmall, .systemMedium, .systemLarge]) // 配置該組件支持的尺寸,如果不配置,默認是大中小都支持
.configurationDisplayName("組件標題") // 在添加組件預覽界面顯示
.description("組件描述") // 在添加組件預覽界面顯示
}
}
通過WidgetBundle實現多個組件
//@main 這個注解去掉
struct Widget1: Widget {
// 小組件的唯一ID
let kind: String = "Widget1"
var body: some WidgetConfiguration {
// 創建時不勾選 “Include Configuration Intent”,這里使用 StaticConfiguration
StaticConfiguration(kind: kind, provider: Provider()) { entry in
Widget1EntryView(entry: entry) // 小組件UI
}
// // 配置該組件支持的尺寸,如果不配置,默認是大中小都支持
.supportedFamilies([.systemSmall, .systemMedium, .systemLarge])
.configurationDisplayName("組件標題") // 在添加組件預覽界面顯示
.description("組件描述") // 在添加組件預覽界面顯示
}
}
@main // 把自定的WidgetBundle作為小組件的初始化入口
struct CustomWidgetBundle: WidgetBundle {
@WidgetBundleBuilder
var body: some Widget {
Widget1()
Widget1()
Widget1()
Widget1()
Widget1()
}
}
實現N個小組件
方法一:使用多個WidgetBundle(每個WidgetBundle的body最多放5個Child)
@main // 把自定的WidgetBundle作為小組件的初始化入口
struct CustomWidgetBundle: WidgetBundle {
// 每個WidgetBundle的body最多放5個Child
@WidgetBundleBuilder
var body: some Widget {
Widget1()
Widget1()
Widget1()
Widget1()
CustomWidgetBundle1().body
}
}
struct CustomWidgetBundle1: WidgetBundle {
@WidgetBundleBuilder
var body: some Widget {
Widget1()
Widget1()
Widget1()
Widget1()
CustomWidgetBundle2().body
}
}
struct CustomWidgetBundle2: WidgetBundle {
@WidgetBundleBuilder
var body: some Widget {
Widget1()
Widget1()
Widget1()
Widget1()
Widget1()
}
}
Widget1支持3個組件,上面的代碼總共13 * 3 = 39個組件,我也不知道有沒有上限。選擇組件的時候,這些組件都會出現在預覽列表
方法二:使用固定的Widget數量(大中小各一個),通過類型切換布局達到目的
@main // 把自定的WidgetBundle作為小組件的初始化入口
struct CustomWidgetBundle: WidgetBundle {
@WidgetBundleBuilder
var body: some Widget {
WidgetSmall()
WidgetMedium()
WidgetLarge()
}
}
通過外部切換組件類型達到實現多個組件的目的,原理這里不再贅述,可參考章節《 IOS Widget(4-2):創建可配置小組件(動態修改配置數據)》。這里你可能遇到一個問題:編輯一個小號組件切換類型時,里面的數據需要全部是小號類型的組件,編輯中號大號時也需要對應各自的類型。希望學到這里,你能獨自解決這個問題,如還不能解決,可留言。
結語
小組件入門之旅結束了,希望通過本系列文章能起到拋磚引玉的效果,感謝讀者。