PresentationMode.dismiss странное поведение при использовании нескольких ссылок NavigationLink внутри ForEach

В моем приложении 4 представления (назовем их View_A [root] - ›View_B -› View_C - ›View_D). Навигация между ними производилась с помощью NavigationView / NavigationLink.

Когда я вызываю self.presentationMode.wrappedValue.dismiss () из последнего представления (View_D), я ожидаю, что он отклонит только текущее представление (D), но по какой-то причине он отклонил ВСЕ представления и остановился в представлении A (корневом представлении).

Это странно. Я потратил пару часов, пытаясь выяснить, что там происходит, и обнаружил, что - если я удалю ForEach из View_A, он будет работать правильно, и будет отклонено только последнее представление. Хотя ForEach получает только 1 статическое изображение объект в этом примере.

Вторая странность в том, что

- если я не изменю self.thisSession.stats на false, он также будет работать правильно, отклоняя только последнее представление.

Это очень странно, поскольку View_A (насколько я понимаю) не зависит от переменной среды thisSession.

Есть идеи, как предотвратить отклонение View_C и View_B в этом случае? Я хочу попасть в View_C после нажатия на ссылку, а не в View_A.

Любая помощь приветствуется, мне потребовалось время, чтобы узнать, откуда она приходит, но я недостаточно умен, чтобы продолжить;)

import SwiftUI

struct A_View: View {
    @EnvironmentObject var thisSession: CurrentSession
    
    var body: some View {
        NavigationView {
            VStack {
                Text("View A")
                ForEach([TestObject()], id: \.id) { _ in
                    NavigationLink(destination: View_B() ) {
                        Text("Move to View B")
                    }
                }
            }
        }
    }
}

struct View_B: View {
    
    var body: some View {
        NavigationView {
            NavigationLink(destination:  View_C()
            ) {
                Text("GO TO VIEW C")
            }
        }
    }
}

struct View_C: View {
    
    var body: some View {
        ZStack {
            NavigationView {
                NavigationLink(destination: View_D()) {
                    Text("GO TO VIEW D")
                }
            }
        }
    }
}

struct View_D: View {
    @EnvironmentObject var thisSession: CurrentSession
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    
    var body: some View {
        ZStack {
            VStack {
                Button(action: {
                    self.thisSession.stats = false
                    self.presentationMode.wrappedValue.dismiss()
                }) {
                    Text("Return!")
                }
            }
        }
    }
}

class CurrentSession: ObservableObject {
    @Published var stats: Bool = false
    @Published var user: String = "user"
}

struct TestObject: Identifiable, Codable {
    let id = UUID()
}

person eugene_prg    schedule 23.07.2020    source источник


Ответы (1)


Ваша проблема связана с:

NavigationView

В всем стеке просмотра должен быть только один NavigationView. Попробуйте удалить NavigationView из представлений B и C

person Samuel-IH    schedule 23.07.2020