簡體   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