经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
IOS小组件(9):让App支持多个小组件的实现方式
来源:cnblogs  作者:popfisher  时间:2021/6/15 9:09:12  对本文有异议

引言

本节作为小组件基础介绍的最后一个章节,前面都没有提到如何支持多个小组件,默认新建一个组件Target,就有大中小三个组件。如果你是为已经存在的App开发一个小组件功能,那么可能你不会需要那么多小组件。但是也有的App需要支持很多个小组件,也可能是无限个。

要实现支持多个小组件,需要使用到WidgetBundle,自定义一个WidgetBundle并改变小组件的初始化入口。

默认小组件入口

  1. @main
  2. struct Widget1: Widget {
  3.     // 小组件的唯一ID
  4.     let kind: String = "Widget1"
  5.     var body: some WidgetConfiguration {
  6.         // 创建时不勾选 “Include Configuration Intent”,这里使用 StaticConfiguration
  7.         StaticConfiguration(kind: kind, provider: Provider()) { entry in
  8.             Widget1EntryView(entry: entry)  // 小组件UI
  9.         }
  10.         .supportedFamilies([.systemSmall, .systemMedium, .systemLarge])  // 配置该组件支持的尺寸,如果不配置,默认是大中小都支持
  11.         .configurationDisplayName("组件标题")   // 在添加组件预览界面显示
  12.         .description("组件描述")                 // 在添加组件预览界面显示
  13.     }
  14. }

通过WidgetBundle实现多个组件

  1. //@main  这个注解去掉
  2. struct Widget1: Widget {
  3.     // 小组件的唯一ID
  4.     let kind: String = "Widget1"
  5.     var body: some WidgetConfiguration {
  6.         // 创建时不勾选 “Include Configuration Intent”,这里使用 StaticConfiguration
  7.         StaticConfiguration(kind: kind, provider: Provider()) { entry in
  8.             Widget1EntryView(entry: entry)  // 小组件UI
  9.         }
  10. // // 配置该组件支持的尺寸,如果不配置,默认是大中小都支持
  11.         .supportedFamilies([.systemSmall, .systemMedium, .systemLarge]) 
  12.         .configurationDisplayName("组件标题")   // 在添加组件预览界面显示
  13.         .description("组件描述")                 // 在添加组件预览界面显示
  14.     }
  15. }
  16. @main   // 把自定的WidgetBundle作为小组件的初始化入口
  17. struct CustomWidgetBundle: WidgetBundle {
  18.     @WidgetBundleBuilder
  19.     var body: some Widget {
  20.         Widget1()
  21.         Widget1()
  22.         Widget1()
  23.         Widget1()
  24.         Widget1()
  25.     }
  26. }

实现N个小组件

方法一:使用多个WidgetBundle(每个WidgetBundle的body最多放5个Child)

  1. @main   // 把自定的WidgetBundle作为小组件的初始化入口
  2. struct CustomWidgetBundle: WidgetBundle {
  3. // 每个WidgetBundle的body最多放5个Child
  4.     @WidgetBundleBuilder
  5.     var body: some Widget {
  6.         Widget1()
  7.         Widget1()
  8.         Widget1()
  9.         Widget1()
  10.         CustomWidgetBundle1().body
  11.     }
  12. }
  13. struct CustomWidgetBundle1: WidgetBundle {
  14.     @WidgetBundleBuilder
  15.     var body: some Widget {
  16.         Widget1()
  17.         Widget1()
  18.         Widget1()
  19.         Widget1()
  20.         CustomWidgetBundle2().body
  21.     }
  22. }
  23. struct CustomWidgetBundle2: WidgetBundle {
  24.     @WidgetBundleBuilder
  25.     var body: some Widget {
  26.         Widget1()
  27.         Widget1()
  28.         Widget1()
  29.         Widget1()
  30.         Widget1()
  31.     }
  32. }

Widget1支持3个组件,上面的代码总共13 * 3 = 39个组件,我也不知道有没有上限。选择组件的时候,这些组件都会出现在预览列表

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

  1. @main   // 把自定的WidgetBundle作为小组件的初始化入口
  2. struct CustomWidgetBundle: WidgetBundle {
  3.     
  4.     @WidgetBundleBuilder
  5.     var body: some Widget {
  6.         WidgetSmall()
  7.         WidgetMedium()
  8.         WidgetLarge()
  9.     }
  10. }

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

结语

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

原文链接:http://www.cnblogs.com/popfisher/p/14874351.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号