【iOS小组件】可交互小组件

可交互小组件


注意:

  • 需要 iOS 17及以上版本

  • 可交互的组件仅支持 Button 和 Toggle 组件,其他控件不支持。

AppIntent意图

要想实现可点击交互的按钮需要继承 AppIntent 并实现对应的方法,AppIntent 在 AppIntents 库中,需要先引入 import AppIntents

swift 复制代码
import AppIntents

// 全局存储结果
struct NumberManager {
    static var number = 0
}

struct MyCalculateIntent: AppIntent {
    // 标题
    static var title: LocalizedStringResource = "My Calculate Task"
    // 描述
    static var description: IntentDescription = IntentDescription("My Calculate Number Task")
    
    // 定义一个变量value
    @Parameter(title: "value")
    var value: Int
    
    init() { }
    init(value: Int) {
       self.value = value
    }
    
    // 计算结果,结果存储到全局
    func perform() async throws -> some IntentResult {
        NumberManager.number += value
        return .result()
    }
}

MyCalculateIntent 结构体遵守 AppIntent 协议并实现了对应的协议内容:title 、description ,并添加了一个 value 属性用来存储传入的数字,最后实现了 perform() 方法。

最终 MyCalculateIntent 会作用在可交互的按钮上,当点击按钮的时候就会调用 perform() 方法进行计算并将计算结果返回。

Widget

可交互小组件只支持 Button 和 Toggle , 点到组件我们可以看到在 iOS 17 上新增了支持传入 AppIntent 协议的初始化方法。

Widget代码

less 复制代码
struct MyWidgetMiddleEntryView : View {
    var entry: Provider.Entry
    
    var body: some View {
        VStack(spacing: 10) {
            HStack {
                 Text("Time:")
                 Text(entry.date, style: .time)
             }

            Text("结果: \(NumberManager.number)")
            
            HStack {
                Button(intent: MyCalculateIntent(value: 10)) {
                    Text("加 10")
                }
                Button(intent: MyCalculateIntent(value: 20)) {
                    Text("加 20")
                }
                Button(intent: MyCalculateIntent(value: -10)) {
                    Text("减 10")
                }
                Button(intent: MyCalculateIntent(value: -20)) {
                    Text("减 20")
                }
            }
            Text("中号组件类型")
        }
        .widgetBackground(Color.white)
    }
}
less 复制代码
struct MyWidgetMiddleEntryView : View {
    var entry: Provider.Entry
    @State var isOn: Bool = true
    
    var body: some View {
        VStack(spacing: 10) {
            HStack {
                 Text("Time:")
                 Text(entry.date, style: .time)
             }

            Text("结果: \(NumberManager.number)")
            
            HStack {
                Toggle(isOn: NumberManager.number % 2 == 0 ? false : true, intent: MyCalculateIntent(value: 1)) {
                    Text("状态发生改变加1");
                }.padding()
            }
        }
        .widgetBackground(Color.white)
    }
}

效果

最好运行看效果,预览模式可能不响应

本文同步自微信公众号 "程序员小溪" ,这里只是同步,想看及时消息请移步我的公众号,不定时更新我的学习经验。

相关推荐
布莱克6054 小时前
Swift 条件语句详解:从 if 到 switch 的完整指南
开发语言·ssh·swift·switch·条件语句·guard·if
布莱克6052 天前
Swift 常量详解:从 let 到编译期优化
服务器·开发语言·ssh·swift·常量·let
布莱克6052 天前
Swift 可选类型(Optionals)详解:从原理到实战
开发语言·安全·ssh·swift·optional·可选类型
fthux4 天前
总想着“忙完再休息”?让 Tick Rest 提醒你,先歇一会儿
开源·github·mac·swift·提醒·消息提醒·tick rest·tick rest for mac·消息提醒app
东坡肘子5 天前
参与学生移动应用大赛有感 -- 肘子的 Swift 周报 #161
人工智能·swiftui·swift
songgeb10 天前
YYImage Bug:一行之差,正常 JPEG 如何在 iOS 被读成条纹
ios·swift
fthux10 天前
Tick Rest,一个休息提醒工具的自我修养
macos·开源·swift
Fatbobman(东坡肘子)11 天前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
开发语言·人工智能·redis·ios·swiftui·iphone·swift
chaoahyl11 天前
WaterDiary 喝水记录 App 实战(2)· 实现喝水首页与本地保存
swift
茶底世界之下12 天前
iPhone Duo 适配实战,Awaking 踩过的 8 个坑
ios·swiftui·swift