Как закрыть все modal view одновременно?


#1

Всем привет!
SwiftUI.
Размещаем объявление (а-ля авито)
Через NavigationView с основного экрана переходим в categoryView потом в subCategoryView и потом в detailView (где публикуем объявление.)
Закрываем detailView через presentationMode.wrappedValue.dismiss()
detailView закрывается, и нас перекидывает в subCategoryView.
Вопрос - как сделать так, чтобы при закрытии detailView закрывались categoryView и subCategoryView ?
Благодарю!


#2

Элементарно:

достаточно в корневом вью (куда вы хотите вернуться) использовать навигейшен линк с конструктором isActive. В последнем вью переключить на false переменную, управляющую параметром isActive. Можно использовать какой-то общий класс, как у меня в примере, или передавать данную переменную вниз по иерархии View через Binding - как удобнее.

class ViewModel: ObservableObject {
    @Published var isActive = false
}

@main
struct TestPopToRootApp: App {
    let vm = ViewModel()
    
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(vm)
        }
    }
}

struct ContentView: View {
    @EnvironmentObject var vm: ViewModel
    
    var body: some View {
        NavigationView {
            NavigationLink("Go to view2", destination: NavView2(), isActive: $vm.isActive)
            .navigationTitle(Text("Root view"))
        }
    }
}

struct NavView2: View {
    var body: some View {
        NavigationLink("Go to view3", destination: NavView3())
        .navigationTitle(Text("view2"))
    }
}

struct NavView3: View {
    @EnvironmentObject var vm: ViewModel
    
    var body: some View {
        Button {
            vm.isActive = false
        } label: {
            Text("Back to root")
        }

        .navigationTitle(Text("view3"))
    }
}

#3

Благодарю, очень доступно и просто=)