主app与widget组件之间的数据通信
在主app和widget的Signing & Capabilties中添加App Groups,保持groupid相同。
//主app存储
NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.dl.app"];
[userDefaults setObject:[NSString stringWithFormat:@"%ld",_countDown] forKey:@"testNum"];
//widget中读取
let object : String = UserDefaults(suiteName: "group.com.dl.app")?.object(forKey: "testNum") as! String
widget组件的编辑
小组件学习记录文章里写了怎么添加可编辑的小组件,给小组件添加了一个可编辑的标题,这是比较简单的编辑项,如果像下面的编辑项,就需要设置其他东西了。
image.png
image.png
假设我们已经创建出来了一个可编辑的组件,那么就会有下面这样的一个文件。
截屏2023-02-04 14.53.40.png
选中Configuration添加新的Parameter,如下,
注意Dynamic Options要勾选,不然等会你会找不到代理方法
。image.png
1. 添加一个新的target
搜索Intents Extension,点击添加;输入项目名称NewTargetWidgetIntent,starting point选择None,点击Embed in Application选择关联主项目app;会生成一个NewTargetWidgetIntent的文件夹。
截屏2023-02-04 14.53.40.png
截屏2023-02-04 15.11.41.png
2. 在新的target文件中找到class IntentHandler
//遵循SecondWidgetConfigIntentHandling这个协议,SecondWidgetConfigIntentHandling是根据我的Configuration名字自动生成的。
//如果你找不到你对应的协议,可能原因:1、你的编辑项配置文件没有勾选这个新target;2、你的项目中设置了类的默认前缀,系统生存协议或者类的时候,会自动加上你们的前缀;3、重启XCode
class IntentHandler: INExtension, SecondWidgetConfigIntentHandling{
//它的两个协议方法
func provideDataArrayOptionsCollection(for intent: SecondWidgetConfigIntent, with completion: @escaping (INObjectCollection<NSString>?, Error?) -> Void) {
let list : [NSString] = ["鸡蛋","黄瓜","西红柿","茄子"]
completion(.init(items: list), nil)
}
func defaultDataArray(for intent: SecondWidgetConfigIntent) -> String? {
return "吃饭"
}
override func handler(for intent: INIntent) -> Any {
return self
}
}