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》

猜你喜欢

转载自blog.csdn.net/qq_38718912/article/details/108148736