IOS小組件(9):讓App支持多個小組件的實現方式


引言

  本節作為小組件基礎介紹的最后一個章節,前面都沒有提到如何支持多個小組件,默認新建一個組件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):創建可配置小組件(動態修改配置數據)》。這里你可能遇到一個問題:編輯一個小號組件切換類型時,里面的數據需要全部是小號類型的組件,編輯中號大號時也需要對應各自的類型。希望學到這里,你能獨自解決這個問題,如還不能解決,可留言。

結語

  小組件入門之旅結束了,希望通過本系列文章能起到拋磚引玉的效果,感謝讀者。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM