SwiftUI:View 方法 OnChange(of: scenePhase) 不接受 2 参数操作

问题描述 投票:0回答:1

在 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
}
swift xcode swiftui onchange
1个回答
0
投票

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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.