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

相关推荐
恋猫de小郭15 小时前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
万少19 小时前
第五款 HarmonyOS 上架作品 奇趣故事匣 来了
前端·harmonyos·客户端
点金石游戏出海21 小时前
每周资讯 | Krafton斥资750亿日元收购日本动画公司ADK;《崩坏:星穹铁道》新版本首日登顶iOS畅销榜
游戏·ios·业界资讯·apple·崩坏星穹铁道
旷世奇才李先生1 天前
Swift 安装使用教程
开发语言·ios·swift
90后的晨仔1 天前
Xcode16报错: SDK does not contain 'libarclite' at the path '/Applicati
ios
finger244801 天前
谈一谈iOS线程管理
ios·objective-c
Digitally1 天前
如何将大型视频文件从 iPhone 传输到 PC
ios·iphone
梅名智1 天前
IOS 蓝牙连接
macos·ios·cocoa
美狐美颜sdk1 天前
跨平台直播美颜SDK集成实录:Android/iOS如何适配贴纸功能
android·人工智能·ios·架构·音视频·美颜sdk·第三方美颜sdk
恋猫de小郭2 天前
Meta 宣布加入 Kotlin 基金会,将为 Kotlin 和 Android 生态提供全新支持
android·开发语言·ios·kotlin