繁体   English   中英

SwiftUI NavigationView 在更新 observableObject 时弹回

[英]SwiftUI NavigationView pops back when updating observableObject

背景:我被这个烦人的问题困扰了好几天,尝试不同的解决方案并搜索stackoverflow等来寻找答案; 有些人有类似的问题,但没有建议的解决方案达到预期的效果。

问题是当在导航层次视图堆栈中更新 observableObject 或 environmentObject 时,视图会弹出回根目录。 从 observableObject 查看数据很好,但不能编辑。

场景是:

  1. 我导航到:root -> view1 -> view2。
  2. 我在 View2 中更新了 environmentObject 但随后又被推回到:root -> view1

我简化了我的应用程序以使其更易于理解。 见下文:

可观察对象:

class DataStore: ObservableObject {
    static let shared = dataStore() 
    @Published var name   : String = ""
}

根视图:

struct ContentView: View {
   @StateObject var dataStore = DataStore.shared
   @State private var isShowingView1 = false
    var body: some View {
        NavigationView{
            VStack{
                Text(dataStore.name)
                NavigationLink(destination: View1(), isActive: $isShowingView1) { }
                Button(action: {
                    isShowingView1 = true
                })
            }
        }
    }
}

视图1:

struct View1: View {
    @EnvironmentObject var dataStore: dataStore
    @State private var isShowingView2 = false
    var body: some View {
        ScrollView{
            VStack(alignment: .center) {
                Text(dataStore.name)
                NavigationLink(destination: View2(), isActive: $isShowingView2) { }
                Button(action: {
                    isShowingView2 = true
                }){
                    Text("Go to View2")
                }
            }
        }
    }
}

视图2:

struct View2: View {
    @EnvironmentObject var dataStore: dataStore
    var body: some View {
        ScrollView{
            VStack(alignment: .center) {
                Text(dataStore.name)
                Button(action: {
                    dataStore.name = "updated value"
                }){
                    Text("Update data")
                }
                // When updating this environmentObject the viewstack will be pushed back to View1. If view2 had been navigated to view3 and the view3 had been updating the environmentObject, then it would also be pushed back to View1.
            }
        }
    }
}

解决方案:我花了很多时间寻找解决方案并尝试不同的方法,但我没有尝试过。 似乎还有其他一些人遇到了与我相同的问题,但建议的解决方案并没有解决问题。 但是后来我在尝试实现另一个功能时偶然发现了这个问题的解决方案。 所以坦率地说,我现在写在这里,不是向这个伟大的社区寻求帮助,而是通过向可能需要看到这个的其他人提供这个解决方案来回馈社区。

解决方案是非常简单的实现,但不是那么容易遇到。 如果您遇到与我类似的问题,那么您只需要相应地更新您的 rootView:

根视图更新:

struct ContentView: View {
   @StateObject var dataStore = DataStore.shared
   @State private var isShowingView1 = false
    var body: some View {
        NavigationView{
            VStack{
                Text(dataStore.name)
                NavigationLink(destination: View1(), isActive: $isShowingView1) { }
                Button(action: {
                    isShowingView1 = true
                })
            }
        }
        .navigationViewStyle(.stack)
        //ADD THIS LINE ABOVE
    }
}

这一行.navigationViewStyle(.stack)为我解决了弹出视图堆栈的问题。 不幸的是,我无法为您提供这种行为的逻辑解释,但它有效,我对此感到满意。 也许你也是,或者也许你对为什么这个解决方案实际上达到了允许视图向下更新 observableObjects 而不被弹出的预期效果有所了解。

该解决方案非常简单,但并不容易遇到。 如果您遇到与我类似的问题,那么您只需要相应地更新您的 rootView:

RootView 更新:

struct ContentView: View {
   @StateObject var dataStore = DataStore.shared
   @State private var isShowingView1 = false
    var body: some View {
        NavigationView{
            VStack{
                Text(dataStore.name)
                NavigationLink(destination: View1(), isActive: $isShowingView1) { }
                Button(action: {
                    isShowingView1 = true
                })
            }
        }
        .navigationViewStyle(.stack)
        //ADD THIS LINE ABOVE
    }
}

这一行 .navigationViewStyle(.stack) 为我解决了弹出视图堆栈的问题。 不幸的是,我无法为您提供这种行为的逻辑解释,但它有效,我对此感到满意。

NavigationView仍然有这种奇怪的行为。

然而, NavigationStack似乎已经解决了这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM