用法一
实例方法
on
onChange(of:perform:)
添加给定值更改时要执行的操作。
声明
func onChange<V>(
of value: V,
perform action: @escaping (V) -> Void
) -> some Scene where V : Equatable
返回值
响应变化而触发动作的场景。
参数
value
确定是否运行闭包时要检查的值。该值必须符合
Equatable
action
值更改时运行的闭包。闭包提供了一个
newValue
参数来指示更改的值。
详述
使用此修饰符在值更改时触发副作用,例如与 SwiftUI/Environment
键或 SwiftUI/Binding
关联的值。例如,当您注意到场景移动到背景时,您可以清除缓存:
struct MyScene: Scene {
@Environment(\.scenePhase) private var scenePhase
@StateObject private var cache = DataCache()
var body: some Scene {
WindowGroup {
MyRootView()
}
.onChange(of: scenePhase) { newScenePhase in
if newScenePhase == .background {
cache.empty()
}
}
}
}
系统在主线程上调用action
闭包,所以要避免闭包中的long-running任务。如果您需要执行此类任务,请分派到后台队列:
.onChange(of: scenePhase) { newScenePhase in
if newScenePhase == .background {
DispatchQueue.global(qos: .background).async {
// ...
}
}
}
系统将新值传递给闭包。如果您需要旧值,请在闭包中捕获它。
可用版本
iOS 14.0+, iPadOS 14.0+, macOS 11.0+, Mac Catalyst 14.0+, tvOS 14.0+, watchOS 7.0+
用法二
实例方法
on
onChange(of:perform:)
为这个视图添加一个修饰符,当一个特定的值改变时触发一个动作。
声明
func onChange<V>(
of value: V,
perform action: @escaping (V) -> Void
) -> some View where V : Equatable
返回值
当指定值更改时触发操作的视图。
参数
value
在确定是否运行闭包时要检查的值。
action
值更改时运行的闭包。
newValue
未通过比较检查的新值。
详述
您可以使用 onChange
作为值更改的结果来触发副作用,例如 Environment
键或 Binding
。
onChange
在主线程上调用。避免在主线程上执行long-running 任务。如果您需要执行 long-running 任务以响应 value
更改,则应分派到后台队列。
新值被传递到闭包中。闭包可以捕获先前的值,以将其与新值进行比较。例如,在以下代码示例中,PlayerView
将旧值和新值都传递给模型。
struct PlayerView: View {
var episode: Episode
@State private var playState: PlayState = .paused
var body: some View {
VStack {
Text(episode.title)
Text(episode.showTitle)
PlayButton(playState: $playState)
}
.onChange(of: playState) { [playState] newState in
model.playStateDidChange(from: playState, to: newState)
}
}
}
可用版本
iOS 14.0+, iPadOS 14.0+, macOS 11.0+, Mac Catalyst 14.0+, tvOS 14.0+, watchOS 7.0+
相关用法
- Swift Never onTapGesture(count:perform:)用法及代码示例
- Swift Never onSubmit(of:_:)用法及代码示例
- Swift Never opacity(_:)用法及代码示例
- Swift Never overlay(_:in:fillStyle:)用法及代码示例
- Swift Never offset(x:y:)用法及代码示例
- Swift Never overlay(_:ignoresSafeAreaEdges:)用法及代码示例
- Swift Never overlay(alignment:content:)用法及代码示例
- Swift Never offset(_:)用法及代码示例
- Swift Never pageCommand(value:in:step:)用法及代码示例
- Swift Never colorMultiply(_:)用法及代码示例
- Swift Never accessibilityAction(action:label:)用法及代码示例
- Swift Never alert(isPresented:error:actions:message:)用法及代码示例
- Swift Never confirmationDialog(_:isPresented:titleVisibility:actions:)用法及代码示例
- Swift Never flipsForRightToLeftLayoutDirection(_:)用法及代码示例
- Swift Never position(x:y:)用法及代码示例
- Swift Never position(_:)用法及代码示例
- Swift Never luminanceToAlpha()用法及代码示例
- Swift Never accessibilityAction(_:_:)用法及代码示例
- Swift Never previewDisplayName(_:)用法及代码示例
- Swift Never badge(_:)用法及代码示例
- Swift Never progressViewStyle(_:)用法及代码示例
- Swift Never buttonStyle(_:)用法及代码示例
- Swift Never popover(isPresented:attachmentAnchor:arrowEdge:content:)用法及代码示例
- Swift Never projectionEffect(_:)用法及代码示例
- Swift Never background(_:ignoresSafeAreaEdges:)用法及代码示例
注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 Never onChange(of:perform:)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。