iOS14 Widget开发踩坑(二)修正版-多个小组件
- 前言
- 添加多个小组件
- 情况1.对于已经写好的一个小组件
- 情况2.对于新建好还没写的小组件
- Widgets的限制
- 突破小组件个数限制的方法
- 参考文献
前言
2020年12月3日
经过进一步的学习 发现了文章中还有很多错误,请酌情观看,,,最新的修改版等我学习确认无误后再发布!
2020年10月3日修正版
在对Widget进行开发了一个月后,解决了几个问题,对本文进行重新编辑以纠正以前的错误和适应最新版本。
本文主要解决如何添加多个小组件的问题和方法。
添加多个小组件
在网上搜索到的文章对于如何创建多个小组件都一笔带过了,例如《[iOS14]WidgetKit开发实战1-初识iOS小部件》中的描述让我这个SwiftUI新手一脸懵逼。
最后经过几次失败的尝试终于得到了正确的打开方式。
情况1.对于已经写好的一个小组件
新建一个Swift文件,将写好的小组件放到新的文件里后,直接将创建时的入口文件的小组件代码直接替换成下面这样。其中的NextWidget 和 NewWidget 就是你的两个小组件。注意:这个列表里最多放10个小组件,因为WidgetBundleBuilder的参数最多传入10个。
@available(iOS 14.0, macOS 11.0, watchOS 9.0, *)
@available(tvOS, unavailable)
extension WidgetBundleBuilder {public static func buildBlock<C0, C1, C2, C3, C4, C5, C6, C7, C8, C9>(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5, _ c6: C6, _ c7: C7, _ c8: C8, _ c9: C9) -> some Widget where C0 : Widget, C1 : Widget, C2 : Widget, C3 : Widget, C4 : Widget, C5 : Widget, C6 : Widget, C7 : Widget, C8 : Widget, C9 : Widget}
多了会报错:Extra argument in call!
注意:放到这个结构体里的Widget如:NextWidget和NewWidget,在编写时要去除@main才能和这个方法兼容。
import SwiftUI
@main
struct Widgets: WidgetBundle {@WidgetBundleBuildervar body: some Widget {NextWidget()NewWidget()}
}
情况2.对于新建好还没写的小组件
就可以直接将创建时的入口文件中的小组件代码替换成上面这样,再在新的文件里写小组件。
Widgets的限制
1.上面提到的,最多只能有10个小组件,一个小组件有3种尺寸,共计30个。
2.使用到小组件的代码都必须是标准的SwiftUI或者调用Swift的方法,我试图使用Swift或OC创建界面后应用到小组件都失败了,但是可以使用MVC的模式将View封装到新的Swift文件里,暴露接口即可。
3.注意:在小组件中使用了主项目创建的文件时,必须在该文件的Target Membership中勾选上小组件的Target。
突破小组件个数限制的方法
import SwiftUI
@main
struct Widgets: WidgetBundle {@WidgetBundleBuildervar body: some Widget {Widget0()Widget1()Widget2()Widget3()Widget4()Widget5()Widget6()Widget7()Widget8()Widgets2().body}
}struct Widgets2: WidgetBundle {@WidgetBundleBuildervar body: some Widget {Widget9()Widget10()Widget11()Widget12()Widget13()Widget14()Widget15()Widget16()Widget17()Widget18()}
}
使用WidgetBundle的叠加进行就可以突破一个方法内只有10个参数的方法。
Widgets2().body会被当成一个Widget参数。
参考文献
本人新手,如果有写错的地方欢迎指正,期待和大家一起交流开发。
《iOS14 Widget开发踩坑(一)修正版-初识别与刷新》
《iOS14WidgetKit开发实战1-4》