当前位置: 代码迷 >> 综合 >> iOS14 Widget开发踩坑(二)修正版-多个小组件
  详细解决方案

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

热度:4   发布时间:2023-12-26 01:54:06.0

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

  • 前言
  • 添加多个小组件
      • 情况1.对于已经写好的一个小组件
      • 情况2.对于新建好还没写的小组件
  • Widgets的限制
  • 重点:突破5个小组件限制的一种实现方法
      • 优点:
      • 缺点:
      • 配置
      • 效果:
  • 参考文献

前言

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

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

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

添加多个小组件

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

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

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

新建一个Swift文件,将写好的小组件放到新的文件里后,直接将创建时的入口文件的小组件代码直接替换成下面这样。其中的NextWidgetNewWidget 就是你的两个小组件。注意:这个列表里最多放5个小组件,多了会报错:Extra argument in call
注意:放到这个结构体里的Widget如:NextWidget和NewWidget,在编写时要去除@main才能和这个方法兼容。

import SwiftUI@main
struct Widgets: WidgetBundle {
    @WidgetBundleBuildervar body: some Widget {
    NextWidget()NewWidget()}
}

情况2.对于新建好还没写的小组件

就可以直接将创建时的入口文件中的小组件代码替换成上面这样,再在新的文件里写小组件。

Widgets的限制

1.上面提到的,最多只能有5个小组件,一个小组件有3种尺寸,共计15个。

2.使用到小组件的代码都必须是标准的SwiftUI或者调用Swift的方法,我试图使用Swift或OC创建界面后应用到小组件都失败了,但是可以使用MVC的模式将View封装到新的Swift文件里,暴露接口即可。

3.注意:在小组件中使用了主项目创建的文件时,必须在该文件的Target Membership中勾选上小组件的Target

重点:突破5个小组件限制的一种实现方法

注意:这个方法只适合不需要用户在小组件上进行数据配置且个数大于5个的情况,用户配置数据可以到主程序进行!!!

struct Widgets: WidgetBundle 只允许介入5个Widget,如果你开发的数量超过5个。就可以将小组件的类型改为用户配置,在写Widget时以尺寸(小/中/大)作为区分依据。使用SiriKit Intent文件让用户选择需要展示的组件类型。快照界面就只是显示提示用户进行类型选择的提示语。
getTimelineWidgetEntryView中使用configuration.type进行区分,来加载不同的数据和界面即可。

switch configuration.type {
    case .type1:xxxcase .type2:xxxcase......default:xxx
}

优点:

1.可以实现超过5种类型的组件添加
2.一次在桌面展示多个同尺寸不同类型的Widget
3.方便对Widget的尺寸进行区分和界面呈现和新类型的Widget添加。

缺点:

1.用户对于组件的编辑就得移动到主程序中,用户配置就只剩下Widget的类型选择!!!
2.控制Widget刷新时无法指定到特定的Widget上,只能刷新同尺寸的所有Widgets

配置

Intent的配置如下图所示:
Intent配置1ContentType配置
配置2

效果:

效果

参考文献

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

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

  相关解决方案