iOS Widget小组件通信、编辑可选择项

主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的文件夹。

选中下面这个文件,勾选这个新target。
截屏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
    }
    
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容