iOS14新增桌面小插件,对于适配来说,还是需要记录一下的,今天配置一个简单的桌面小插件。
设备准备:Version 12.1 (12A7403) macOS Catalina 10.15.4
首先先创建一个工程,命名为StaticWidget,如下图所示:
我们首选SwiftUI开发,对于开发桌面小程序来说,只能用SwiftUI,这也是我们使用SwiftUI开发一个重要原因。
创建Widget
我们先创建一个Target,选择widget。如下图:
这里需要注意一下,记得选中Include Configuration Internt这个选项,他会自动创建配置文件。创建后的目录如下:
我们来看一下这个工程里的主函数,如下;
@main
struct MainWidget: Widget {
let kind: String = "MainWidget"
var body: some WidgetConfiguration {
IntentConfiguration(kind: kind, intent: MainConfigIntent.self, provider: DengjiProvider()) { entry in
MainWidgetEntryView(entry: entry)
}
.configurationDisplayName("My Widget")
.description("This is an example widget.")
}
}
改成如下的函数:
@main
struct EnglishLevel: Widget {
let kind: String = "EnglishLevel"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider()) { (entry) in
EnglishLevelEntryView(entry: entry)
}.configurationDisplayName("My Widget")
.description("This is an example widget.")
}
}
这个是静态的配置,不能动态改变。不需要配置太多。这时候我们需要修改Provider,需要他实现TimelineProvider协议。
下面我们看看怎么实现TimelineProvider协议。首先找到这个结构体,并且删除原来的方法,实现TimelineProvider协议。如下:
struct Provider: TimelineProvider {
func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> Void) {
completion(.init(date: Date(), listDate: ["英语4级"]))
}
func getTimeline(in context: Context, completion: @escaping (Timeline<SimpleEntry>) -> Void) {
completion(.init(entries: [.init(date: Date(), listDate: ["小明:","英语8级"])], policy: .atEnd))
}
func placeholder(in context: Context) -> SimpleEntry {
SimpleEntry(date: Date(), listDate: ["初级"])
}
}
这时候 我们需要重新定义SimpleEntry,这个是数据源,需要们去维护,修改如下:
struct SimpleEntry: TimelineEntry {
let date: Date
// let configuration: ConfigurationIntent
let listDate: [String]
}
这个实际上根据自己的需要添加属性,我们这个以listDate为粒子,字符串数组。那么和他相关的视图也要修改如下:
struct EnglishLevelEntryView : View {
var entry: Provider.Entry
var body: some View {
var value = "";
for item in entry.listDate {
value += item;
}
return Text(value)
}
}
运行后效果如下;
至此,一个简单的小插件已经完成,多做些小练习也可以快速进入转态,学习的道路上总不缺少努力的人。
留下一个问题EnglishLevel.intentdefinition这个文件没有用到,下一篇写这个例子。