Быстрая навигация назад к определенному виду

#ios #swiftui

Вопрос:

У меня есть навигационное представление, в котором есть несколько уровней навигационной ссылки.

например, A1->A2->>A3->>>A4->>>>A5.

 struct A1: View {
    var body: some View {
        VStack{
            Text("this is A1")
            NavigationLink("to a2", destination: A2())
        }  
    }
}
struct A2: View {
    var body: some View {
        VStack{
            Text("this is A2")
            NavigationLink("to a3", destination: A3())
        }  
    }
}
struct A3: View {
    var body: some View {
        VStack{
            Text("this is A3")
            NavigationLink("to a4", destination: A4())
        }  
    }
}
struct A4: View {
    var body: some View {
        VStack{
            Text("this is A4")
            NavigationLink("to a5", destination: A5())
        }  
    }
}
struct A5: View {
    var body: some View {
        VStack{
            Text("this is A5")
            NavigationLink("to A2", destination: A2())
        }  
    }
}
 

Тем не менее, это только добавляет еще A2() один уровень до 6-го, вместо этого перейдите обратно на второй уровень.

Я заметил, что есть @Environment(.presentationMode) var mode: Binding<PresentationMode> и self.mode.wrappedValue.dismiss() для выполнения программной навигации назад, но все еще не могу найти способ сделать это несколько раз одновременно.

Пожалуйста, помогите мне.

Ответ №1:

Вам нужно использовать следующее NavigationLink A2 .

init(destination: Destination, isActive: Binding<Bool>, label: () -> Label) Создает навигационную ссылку, которая представляет представление назначения, когда оно активно.

https://developer.apple.com/documentation/swiftui/navigationlink/init(пункт назначения:активен:метка:)

Используйте следующее NavigationLink в A3 и A4 .

init(destination: () -> Destination, label: () -> Label)

Создает навигационную ссылку, которая представляет представление назначения.

https://developer.apple.com/documentation/swiftui/navigationlink/init(пункт назначения:метка:)-27n7s

В A5 , используйте Button instad of NavigationLink .

И передай isActive наверх A5 . Переключайтесь isActive при нажатии кнопки.

В этом примере A2-это представление, к которому вы хотите вернуться.

 
struct A2: View {
    @State private var isActive: Bool = false
    
    var body: some View {
        NavigationView {
            NavigationLink(destination: A3(isActive: self.$isActive), isActive: $isActive) {TText("this is A2") }
        }
    }
}


struct A3: View {
    
    @Binding var isActive: Bool
    
    var body: some View {
        VStack {
            NavigationLink(destination: A4(isActive: self.$isActive)) {Text("this is A3"))}
        }
    }
}



struct A4: View {
    
    @Binding var isActive: Bool
    
    var body: some View {
        VStack {
            NavigationLink(destination: A5(isActive: self.$isActive)) {Text("this is A4"))}
        }
    }
}


struct A5: View {
    
    @Binding var isActive: Bool
    
    var body: some View {
        Button(action: {
                    self.isActive.toggle()
                }, label: {
                    Text("this is A5")
                })
    }
}