当前位置:   article > 正文

IOS Widget(4-1):创建可配置小组件(静态配置数据)_intentconfiguration 代码化

intentconfiguration 代码化

引言

购物优惠券 https://www.cqfenfa.com/

  经过前面几篇文章阅读,已经掌握开发一款小组件的基本技能了,接下来开始掌握一些相对高级一点的技能。本文创建一个可配置小组件,通过修改时间类型,让Text空间显示不同格式的时间。

本文大纲

  • 添加动态配置 Custom Intent Definition
  • 可配置小组件框架代码解析
  • 修改 .intentdefinition 文件实现修改时间类型
  • 代码读取配置信息,实现动态布局

添加动态配置

方式1:新建组件的时候勾选 “Include Configuration Intent” 复选框。

方式2:在您的Xcode项目中,选择“File”>“New File”,然后选择“SiriKit Intent Definition File”。单击”Next“,并在出现提示时保存文件。Xcode在项目中会生成一个新的.intentdefinition 文件。

可配置小组件框架代码解析

  如果默认用方式1 创建组件,代码如下,如果通过方式2,请参考下面的代码对应修改即可,注释中已经标明与普通小组件代码的不同点。

  1. //
  2. //  WidgetConfigIntent.swift
  3. //  WidgetConfigIntent
  4. //
  5. import WidgetKit
  6. import SwiftUI
  7. import Intents
  8. struct Provider: IntentTimelineProvider {
  9.     func placeholder(in context: Context) -> SimpleEntry {
  10.         // 不同点3:传递默认参数
  11.         SimpleEntry(date: Date(), configuration: ConfigurationIntent())
  12.     }
  13.     // 不同点4:比使用StaticConfiguration时多了一个配置参数
  14.     func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) {
  15.         let entry = SimpleEntry(date: Date(), configuration: configuration)
  16.         completion(entry)
  17.     }
  18.     // 不同点5:比使用StaticConfiguration时多了一个配置参数
  19.     func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
  20.         var entries: [SimpleEntry] = []
  21.         // Generate a timeline consisting of five entries an hour apart, starting from the current date.
  22.         let currentDate = Date()
  23.         for hourOffset in 0 ..< 5 {
  24.             let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)!
  25.             let entry = SimpleEntry(date: entryDate, configuration: configuration)
  26.             entries.append(entry)
  27.         }
  28.         let timeline = Timeline(entries: entries, policy: .atEnd)
  29.         completion(timeline)
  30.     }
  31. }
  32. struct SimpleEntry: TimelineEntry {
  33.     let date: Date
  34.     // 不同点2: 多了一个配置参数,小组件编辑界面设置参数会通过这个传递进来
  35.     let configuration: ConfigurationIntent
  36. }
  37. struct WidgetConfigIntentEntryView : View {
  38.     var entry: Provider.Entry
  39.     var body: some View {
  40.         Text(entry.date, style: .time)
  41.     }
  42. }
  43. // 小组件入口
  44. @main
  45. struct WidgetConfigIntent: Widget {
  46.     let kind: String = "WidgetConfigIntent"
  47.     var body: some WidgetConfiguration {
  48.         //不同点1: 这里使用 IntentConfiguration, 对比 StaticConfiguration
  49. //这里还多了一个参数 intent: ConfigurationIntent.self
  50.         IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider()) { entry in
  51.             WidgetConfigIntentEntryView(entry: entry)
  52.         }
  53.         .configurationDisplayName("可配置小组件")
  54.         .description("选择不同的时间类型")
  55.     }
  56. }
  57. // 调试预览
  58. struct WidgetConfigIntent_Previews: PreviewProvider {
  59.     static var previews: some View {
  60.         WidgetConfigIntentEntryView(entry: SimpleEntry(date: Date(), configuration: ConfigurationIntent()))
  61.             .previewContext(WidgetPreviewContext(family: .systemSmall))
  62.     }
  63. }

修改 .intentdefinition 文件实现修改时间类型

  1. 修改配置名称为TimeTypeConfiguration
  2. 添加参数类型TimeTypeEnum,这里先用枚举类型

  1. 添加参数timeType参数,类型指定为TimeTypeEnum

代码读取配置信息,实现动态布局

  现在编译应该不通过,需要修改一下WidgetConfigIntent.swift中的代码

  1. 把代码中 ConfigurationIntent 替换为 TimeTypeConfigurationIntent(希望到这里你能领悟到点什么)
    运行代码,在桌面添加组件,长按组件 > 编辑小组件可以看到如下图所示(目前点了还没有什么效果)

    代码中获取配置信息,动态改变布局。接下来再编辑小组件,切换时间time/date时界面会发生响应的变化
  1. struct WidgetConfigIntentEntryView : View {
  2.     var entry: Provider.Entry
  3.     var body: some View {
  4.         // 根据配置信息动态改变布局
  5.         if (entry.configuration.timeType == TimeTypeEnum.time) {
  6.             Text(entry.date, style: .time)
  7.         } else {
  8.             Text(entry.date, style: .date)
  9.         }
  10.     }
  11. }

结语

  本文讲解了实现一个简单的可配置小组件,不过数据都是静态配置,下一节讲解动态修改配置数据,这个在实际开发中也是比较重要的环节。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号