欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

IOS小组件(9):让App支持多个小组件的实现方式

程序员文章站 2022-03-12 20:18:10
引言 本节作为小组件基础介绍的最后一个章节,前面都没有提到如何支持多个小组件,默认新建一个组件Target,就有大中小三个组件。如果你是为已经存在的App开发一个小组件功能,那么可能你不会需要那么多小组件。但是也有的App需要支持很多个小组件,也可能是无限个。 要实现支持多个小组件,需要使用到Wid ......

引言

  本节作为小组件基础介绍的最后一个章节,前面都没有提到如何支持多个小组件,默认新建一个组件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个组件,我也不知道有没有上限。选择组件的时候,这些组件都会出现在预览列表
IOS小组件(9):让App支持多个小组件的实现方式

方法二:使用固定的widget数量(大中小各一个),通过类型切换布局达到目的

@main   // 把自定的widgetbundle作为小组件的初始化入口
struct customwidgetbundle: widgetbundle {
    
    @widgetbundlebuilder
    var body: some widget {
        widgetsmall()
        widgetmedium()
        widgetlarge()
    }
}

  通过外部切换组件类型达到实现多个组件的目的,原理这里不再赘述,可参考章节《 ios widget(4-2):创建可配置小组件(动态修改配置数据)》。这里你可能遇到一个问题:编辑一个小号组件切换类型时,里面的数据需要全部是小号类型的组件,编辑中号大号时也需要对应各自的类型。希望学到这里,你能独自解决这个问题,如还不能解决,可留言。

结语

  小组件入门之旅结束了,希望通过本系列文章能起到抛砖引玉的效果,感谢读者。