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

相关推荐
胖虎11 小时前
我用一个 UITableView,干掉了 80% 复杂页面
ios·架构·cocoa·uitableview·ui布局
T1an-11 小时前
最右IOS开发A卷笔试题3.31
c++·ios
wzl202612132 小时前
《从协议层对抗折叠:iPad协议脚本在企微批量群发中的集成与优化》
ios·企业微信·ipad
茶底世界之下3 小时前
Harbeth:高性能Metal图像处理库,让你的图片处理速度飞起来!
前端·github·swift
season_zhu3 小时前
聊聊我最近都干了些什么,AI 时代的手动撸码人
flutter·ios·ai编程
FreeBuf_3 小时前
俄罗斯关联APT组织TA446利用DarkSword漏洞工具包针对iPhone用户发起钓鱼攻击
ios·iphone
Digitally3 小时前
三种将文件从iPhone传输到 Windows 11的方法
ios·iphone
搜佛说3 小时前
14-第14章-扩展点与插件机制
物联网·ios·开源·软件工程·边缘计算·iphone
风舞雪凌月4 小时前
【趣谈】移动系统和桌面系统编程语言思考
java·c语言·c++·python·学习·objective-c·swift
2501_915106324 小时前
Flutter 开发工具有哪些 跨平台项目开发与上架实操指南
android·flutter·ios·小程序·uni-app·iphone·webview