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

相关推荐
陈皮话梅糖@4 小时前
iOS 集成ffmpeg
ios·ffmpeg
幽夜落雨5 小时前
ios老版本应用安装方法
ios
胖虎113 小时前
实现 iOS 自定义高斯模糊文字效果的 UILabel(文末有Demo)
ios·高斯模糊文字·模糊文字
_可乐无糖2 天前
Appium 检查安装的驱动
android·ui·ios·appium·自动化
胖虎12 天前
iOS 网络请求: Alamofire 结合 ObjectMapper 实现自动解析
ios·alamofire·objectmapper·网络请求自动解析·数据自动解析模型
开发者如是说3 天前
破茧英语路:我的经验与自研软件
ios·创业·推广
假装自己很用心3 天前
iOS 内购接入StoreKit2 及低与iOS 15 版本StoreKit 1 兼容方案实现
ios·swift·storekit·storekit2
iOS阿玮3 天前
“小红书”海外版正式更名“ rednote”,突然爆红的背后带给开发者哪些思考?
ios·app·apple
刘小哈哈哈3 天前
iOS UIScrollView的一个特性
macos·ios·cocoa
忆江南的博客4 天前
iOS 性能优化:实战案例分享
ios