iOS14 Widget开发踩坑(二)修正版-多个小组件

前言

2020年12月3日
经过进一步的学习 发现了文章中还有很多错误,请酌情观看,,,最新的修改版等我学习确认无误后再发布!

2020年10月3日修正版
在对Widget进行开发了一个月后,解决了几个问题,对本文进行重新编辑以纠正以前的错误和适应最新版本。

本文主要解决如何添加多个小组件的问题和方法。

添加多个小组件

在网上搜索到的文章对于如何创建多个小组件都一笔带过了,例如《[iOS14]WidgetKit开发实战1-初识iOS小部件》中的描述让我这个SwiftUI新手一脸懵逼。

[iOS14]WidgetKit开发实战1-初识iOS小部件
最后经过几次失败的尝试终于得到了正确的打开方式。

情况1.对于已经写好的一个小组件

新建一个Swift文件,将写好的小组件放到新的文件里后,直接将创建时的入口文件的小组件代码直接替换成下面这样。其中的NextWidgetNewWidget 就是你的两个小组件。注意:这个列表里最多放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 {
    @WidgetBundleBuilder
    var 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 {
    @WidgetBundleBuilder
    var body: some Widget {
        Widget0()
        Widget1()
        Widget2()
        Widget3()
        Widget4()
        Widget5()
        Widget6()
        Widget7()
        Widget8()
        Widgets2().body
    }
}

struct Widgets2: WidgetBundle {
    @WidgetBundleBuilder
    var body: some Widget {
        Widget9()
        Widget10()
        Widget11()
        Widget12()
        Widget13()
        Widget14()
        Widget15()
        Widget16()
        Widget17()
        Widget18()
    }
}

使用WidgetBundle的叠加进行就可以突破一个方法内只有10个参数的方法。
Widgets2().body会被当成一个Widget参数。

参考文献

本人新手,如果有写错的地方欢迎指正,期待和大家一起交流开发。

《iOS14 Widget开发踩坑(一)修正版-初识别与刷新》
《iOS14WidgetKit开发实战1-4》

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值