用法一
實例方法
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:)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。