iOS 小组件开发第五篇:开发可配置的小组件

这里每天分享一个 iOS 的新知识,快来关注我吧

前言

前面已经介绍了几篇关于小组件的文章,还没读过的可以先去读一下:

iOS 小组件开发第一篇:基础介绍

iOS 小组件开发第二篇:时间线

iOS 小组件开发第三篇:实战

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新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
丿Wayne6 小时前
iOS Token 刷新实战(Actor 避免并发重复刷新)
ios·swift·token·actor·swift并发
终端安全笔记1 天前
iOS 27 给了租赁一个新工具,但它只认受监督的设备
android·网络·安全·ios
大熊猫侯佩1 天前
独立 App 首发完成 iPhone Duo 展开态适配
ios·swiftui·swift
光影少年1 天前
setImmediate 和 setTimeout(0) 的区别
android·前端·react.js·ios·前端框架
2501_916008891 天前
SSE 和 gRPC 流式接口如何抓包,调试 SSE 与 gRPC 流式接口
网络协议·计算机网络·网络安全·ios·adb·https·udp
HouWan2 天前
Flutter: MediaQuery.of(context) 为什么可能拖慢页面?
android·flutter·ios
SoaringHeart2 天前
Swift 进阶&封装:仿 Get 给SwiftUI 添加路由导航能力
swiftui·swift
用户38034165882972 天前
Broadcast Extension 里的 Live Activity:一次跨进程妥协
ios·音视频开发
匠测AI说2 天前
XCUITest 自动化全解:同进程白盒、XCTest 架构、自动同步机制与 iOS 端选型指南
测试工具·ios·自动化
silianpan2 天前
CAD 文档预览 UTS 插件
android·ios·harmonyos