这里每天分享一个 iOS 的新知识,快来关注我吧
前言
前面已经讲了几期小组件相关的内容,在看这篇之前可以先去回顾一下:
iOS 小组件开发第一篇:基础介绍
iOS 小组件开发第二篇:时间线
iOS 小组件开发第三篇:实战
iOS 小组件开发第四篇:小组件的尺寸
iOS 小组件开发第五篇:开发可配置的小组件
今天来讲讲小组件的点击事件,以及如何响应用户的事件。
小型组件
对于小型组件(systemSmall
),可以直接将 widgetURL(_:)
视图修饰符添加到小组件视图层次结构中的视图上:
css
struct MyWidgetEntryView : View {
var entry: Provider.Entry
var body: some View {
VStack {
Text(entry.date, style: .date)
}
.widgetURL(URL(string: "iosnews://iosNews.com/p1=1&p2=2"))
}
}
这样就给小组件绑定了一个 URL,当用点击这个小组件时,会调用主 App 内的回调方法,具体调用哪个方法取决于:
-
如果你的主 App 用 SwiftUI,则调用
onOpenURL(perform:)
方法。 -
如果你的主 App 用
SceneDelegate
管理生命周期,则调用scene(_:, openURLContexts:)
方法。 -
如果你的主
App
用AppDelegate
管理生命周期,则调用application(_:open:options:)
方法
注意应该只在小组件的视图层次结构中添加一次
widgetURL
,如果添加多个,可能会导致最终无法确定执行的是哪一个
中型组件和大型组件
对于中型组件和大型组件,不仅可以使用 widgetURL
,还可以使用 Link
组件,Link 组件相当于是一个可点击的容器,上边可以设置一个自定义的 URL,比如我们在小组件上设置三个按钮:
less
struct MyWidgetEntryView : View {
var entry: Provider.Entry
var body: some View {
HStack(spacing: 10) {
Link(destination: URL(string: "https://www.link1.com")!, label: {
Text("链接1").foregroundColor(.blue)
})
Link(destination: URL(string: "https://www.link2.com")!, label: {
Text("链接2").foregroundColor(.blue)
})
Link(destination: URL(string: "https://www.link3.com")!, label: {
Text("链接3").foregroundColor(.blue)
})
}
.widgetURL(URL(string: "iosnews://iosNews.com/p1=1&p2=2"))
}
}
这时候分别点击三个链接都是可以点击的。
在 iOS 17 上 systemSmall 类型的貌似也支持 Link 组件了,关于 iOS 17 新出的可直接交互的小组件,我们后面再讲。
这里每天分享一个 iOS 的新知识,快来关注我吧
本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!