iOS14-桌面小插件 StaticConfiguration

2 篇文章 0 订阅
2 篇文章 0 订阅

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这个文件没有用到,下一篇写这个例子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值