这里每天共享一个 iOS 的新知识,快来重视我吧
前语
小组件相关内容传送门:
iOS 小组件开发第一篇:根底介绍
iOS 小组件开发第二篇:时间线
iOS 小组件开发第三篇:实战
iOS 小组件开发第四篇:小组件的尺度
iOS 小组件开发第五篇:开发可装备的小组件
iOS 小组件开发第六篇:点击事情和交互
iOS 小组件开发第七篇:锁屏小组件
iOS 小组件开发第八篇:灵动岛开发
今日继续讲小组件,在今年的 iOS 17 中,苹果对小组件的才能进一步晋级,现在终于能够在不翻开 App 的情况下进行交互了,今日就带大家一同完成这个新功用。
创立
首要还是先创立一个 Widget Target
:
AppIntent
要想完成可点击的按钮需求先自定义一个 AppIntent
,比方咱们要完成一个计数器的功用,能够这样完成一个 AppIntent
:
首要导入 import AppIntents
,然后完成以下代码:
struct CalculateIntent: AppIntent {
static var title: LocalizedStringResource = "Calculate Task"
static var description: IntentDescription = IntentDescription("Calculate Number Task")
@Parameter(title: "value")
var value: Int
init() { }
init(value: Int) {
self.value = value
}
func perform() async throws -> some IntentResult {
NumberManager.number += value
return .result()
}
}
解释一下代码,咱们完成一个名为 CalculateIntent
的结构体,遵守 AppIntent
协议,然后完成协议内容:title
、description
,然后增加一个 value
特点,Int 类型,用来存储传入的数字,最终完成 perform()
办法。
终究这个 CalculateIntent
会用在咱们可交互的按钮上,当点击按钮的时候会调用 perform()
办法。
除此之外,咱们还需求一个全局特点存储核算的结果:
struct NumberManager {
static var number = 0
}
当咱们履行完运算,return .result()
的时候,体系会主动调用刷新操作,此时会刷新小组件的时间线。
Widegt 代码部分
有了 CalculateIntent
结构体就能够来构建可交互的按钮了,Button
组件 和 Toggle
组件在 iOS 17 上新增了支持传入 AppIntent
协议的初始化办法:
@available(iOS 17.0, macOS 13.0, tvOS 17.0, watchOS 10.0, *)
extension Button {
/// Creates a button that performs an `AppIntent`.
///
/// - Parameters:
/// - intent: The `AppIntent` to execute.
/// - label: A view that describes the purpose of the button's `action`.
public init<I>(intent: I, @ViewBuilder label: () -> Label) where I : AppIntent
}
@available(iOS 17.0, macOS 13.0, tvOS 17.0, watchOS 10.0, *)
extension Toggle {
/// Creates a toggle performing an `AppIntent`.
///
/// - Parameters:
/// - isOn: Whether the toggle is on or off.
/// - intent: The `AppIntent` to be performed.
/// - label: A view that describes the purpose of the toggle.
public init<I>(isOn: Bool, intent: I, @ViewBuilder label: () -> Label) where I : AppIntent
}
利用这个办法能够创立出可交互的 Button
,咱们在页面上创立几个用来点击核算的按钮,别的再创立一个展现终究结果的 Text
组件:
struct InteractivityWidgetEntryView : View {
var entry: Provider.Entry
var body: some View {
VStack {
Text("结果: (NumberManager.number)")
HStack {
Button(intent: CalculateIntent(value: 10)) {
Text("加 10")
}
Button(intent: CalculateIntent(value: 1)) {
Text("加 1")
}
Button(intent: CalculateIntent(value: -1)) {
Text("减 1")
}
Button(intent: CalculateIntent(value: -10)) {
Text("减 10")
}
}
}
}
}
最终看下效果:
当点击下边几个按钮时,会履行数字核算,最终显现在上边的 Text
中。
最终
需求留意,可交互的组件仅支持 Button
和 Toggle
组件,其他控件都不起作用。
别的,由于 AppIntent
履行结束后,会导致小组件从头加载时间线,这就会带来从操作到 UI 结果展现之间有一小段延迟,Apple 也提供了一个方法防止这种问题,能够使用 .invalidatableContent()
修饰符来修饰某个视图,这样在点击按钮之后到 UI 更新之前,更新内容都是无效的。
这里每天共享一个 iOS 的新知识,快来重视我吧
本文同步自微信大众号 “iOS新知”,每天按时共享一个新知识,这里只是同步,想要及时学到就来重视我吧!