在 SwiftUI 中,我想对 scenePhase 使用 onChange(of:, action:) 函数,但构建失败。
struct MyView: View {
@Environment(\.scenePhase) var scenePhase
@State private var timerStatus: TimerStatus
var body: some View {
VStack {
Text(...)
Button(...)
}
.onChange(of: scenePhase) { oldState, newState in // Error on this line
if newState == .active {
// some code
} else if oldState == .active {
// some code
}
}
.onChange(of: timerStatus) { oldState, newState in
// some code
}
}
}
enum TimerStatus {
case paused
case runningActive
case runningInactive
}
我收到以下错误:
“上下文闭包类型 '(ScenePhase) -> Void' 需要 1 个参数,但在闭包主体中使用了 2 个参数”
您知道为什么我会收到此错误以及如何修复它吗?
我正在 Xcode 中开发适用于 iOS 18.2 的程序。
当我对 onChange() 函数使用“跳转到定义”功能时,显示了旧版本的 onChange:
@available(iOS 14.0, macOS 11.0, tvOS 14.0, watchOS 7.0, *)
extension View {
@inlinable nonisolated public func onChange<V>(of value: V, perform action: @escaping (_ newValue: V) -> Void) -> some View where V : Equatable
}
onChange(of:timerStatus) 工作时不会出现错误,并且“跳转到定义”显示较新的定义:
@available(iOS 17.0, macOS 14.0, tvOS 17.0, watchOS 10.0, *)
extension View {
nonisolated public func onChange<V>(of value: V, initial: Bool = false, _ action: @escaping (_ oldValue: V, _ newValue: V) -> Void) -> some View where V : Equatable
}
SwiftUI 中的 scenePhase 环境值仅反映应用程序当前的生命周期状态。它没有在 onChange(of:) 方法中提供 oldValue。
将先前的值存储在单独的变量中:
@Environment(\.scenePhase) var scenePhase
@State private var previousScenePhase: ScenePhase?
var body: some View {
VStack {
Text("...")
Button("...")
}
.onChange(of: scenePhase) { newState in
if let oldState = previousScenePhase {
if newState == .active {
// Handle activation
} else if oldState == .active {
// Handle deactivation
}
}
previousScenePhase = newState
}
}