SwiftUI - iOS - 使用 scenePhase 会导致视图在应用程序进入后台并返回活动状态时弹出

SwiftUI - iOS - Using scenePhase causes views to pop when app going to background and back to active

我有一个项目,我正在尝试实施 scenePhase。实现的逻辑似乎工作正常,但我有以下奇怪的问题。 当 iOS(还有 Android)应用程序进入后台,然后再次点击时,预计会转到最后显示的屏幕。发生这种情况,但是当我声明(甚至不使用)环境变量“scenePhase”时,当我将我的应用程序置于后台然后再次激活它时,它会显示下一个声明屏幕。 让我用一些代码来说明一下(与我的应用程序相比进行了简化,但这里也存在行为):

第一个视图:

import SwiftUI

struct ContentView: View {
    
    @State var actionState: Int? = 0
    @Environment(\.scenePhase) private var scenePhase
    
    var body: some View {
        NavigationView{
            NavigationLink(destination: View2(), tag: 1, selection: $actionState, label: {
                Button(action: {
                    actionState = 1
                }, label:{
                    Text("Hello, world! 1 ")
                        .padding()
                })
            })
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

第二个视图:

import SwiftUI

struct View2: View {
    var body: some View {
        NavigationLink(destination: View3()){
            Text("Hello, world! 2 ")
                .padding()
        }
    }
}

struct View2_Previews: PreviewProvider {
    static var previews: some View {
        View2()
    }
}

第三个视图:

import SwiftUI

struct View3: View {
    var body: some View {
        Text("Hello, World! 3")
    }
}

struct View3_Previews: PreviewProvider {
    static var previews: some View {
        View3()
    }
}

如果我跟随点击,一直转到第三个视图,当我将应用程序置于后台然后再次转到前台时,它显示的不是第三个,而是第二个视图。 如果我删除此声明:@Environment(\.scenePhase) private var scenePhase 它(正确地)显示了第三个视图。 感谢任何帮助!!!

scenePhase 更改导致 body 被调用以重新计算 View 层次结构,您不能拥有超过一个细节 NavigationLink,因此您需要设置第二个 isDetailLink(false).

顺便说一下,您不需要 NavigationLink 中的 Button,因为它会呈现一个 suitable 可点击的东西,例如按钮或 table 行本身。