这里每天分享一个 iOS 的新知识,快来关注我吧
前言
前面已经介绍了几篇关于小组件的文章,还没读过的可以先去读一下:
前几天介绍的都是静态的小组件,其实小组件是支持设置一些配置的,比如日历组件,当你长按小组件时,可以选择编辑小组件按钮:
然后就能看到它配置了两个开关:
再例如,Apple Card 小组件支持选择周期:
添加配置意图
如果需要添加类似的配置,需要在创建小组件的时候把 Include Configuration Intent
勾选上。
然后会发现,创建出的文件中多了一个 MyIntentWidget.intentdefinition
文件,这就是用于配置的文件:
然后再打开 MyIntentWidget.swift
,可以看到 Provider
继承 IntentTimelineProvider
这个类可以把用户选择的配置同步到你的时间线中。
配置
选中 MyIntentWidget.intentdefinition
,点击左侧的加号,添加一个参数:
Display Name
是参数渲染的名称,Type
是类型,目前支持很多种:
不同种类的类型可能渲染的 UI 也不一样,比如上边提到的日历小组件的开关,就是 Boolean
类型,Apple Card 的小组件用的是 Enum 类型。
所有类型我就不一一列举了,我门找几个常用的来展示一下:
首选我创建了一个字符串类型的参数,用来让用户输入名字:
然后是一个数字类型的参数,用来让用户输入年龄,注意这里的 Input
可以选择 Field
或者 Stepper
,如果是 Field
,则会渲染一个输入框,我选择了 Stepper
,最终渲染一个可以加减的步进器。另外还可以设置最大值、最小值以及默认值:
最后我还添加了一个枚举类型的参数,可以让用户选择性别,首先选择类型的时候点击 Add Enum...
按钮,添加一个新的枚举,然后在新的页面中设置枚举值:
都配置完成后,我们来运行一下程序,长按小组件时,已经能看到 编辑小组件 这个按钮了
点击进去,可以看到我们刚刚设置的三个参数:
代码中获取参数
配置完成之后,最后一步就是要在代码中获取用户设置的这些参数的值,我们在 TimelineEntry
类中可以看到,有个 ConfigurationIntent
类型的参数:
vbnet
struct SimpleEntry: TimelineEntry {
let date: Date
let configuration: ConfigurationIntent
}
点进声明中看下,发现系统已经自动帮我们生成了刚刚设置的三个参数:
less
@available(iOS 12.0, macOS 11.0, watchOS 5.0, *) @available(tvOS, unavailable)
@objc(ConfigurationIntent)
public class ConfigurationIntent: INIntent {
@NSManaged public var name: String?
@NSManaged public var gender: Enum
@NSManaged public var age: NSNumber?
}
最后我们尝试把这些参数渲染出来:
swift
struct MyIntentWidgetEntryView : View {
var entry: Provider.Entry
var body: some View {
let configuration = entry.configuration
VStack(alignment: .leading, spacing: 10) {
Text("姓名:\(configuration.name ?? "无")")
Text("年龄:\(configuration.age ?? 0)")
Text("性别:\(getGender())")
}
.font(.system(size: 12))
}
func getGender() -> String {
switch entry.configuration.gender {
case .man:
return "男"
case .woman:
return "女"
case .unknown:
return "未知"
}
}
}
再运行一次,就能看到效果了,每次用户编辑完成,这些值也会自动刷新:
其实现在的 Xcode 针对这些配置已经相当友好简单了,更多的配置参数大家可以自己摸索一下。
这里每天分享一个 iOS 的新知识,快来关注我吧
本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!