Как вернуться назад и в другой вид?

У меня есть 3 представления: A (основное), B и C. Из ViewA можно перейти либо к ViewB, либо к ViewC, в то время как B и C могут только закрыть себя, как на диаграмме ниже:

  A
 / \ 
B   C

В зависимости от того, что происходит в ViewB, я хочу вернуться в ViewA и открыть ViewC. Я попытался отправить переменную состояния в ViewB в качестве привязки.

NavigationLink(destination: B_View(locations: self.$showC), isActive: $showB) { EmptyView() }

Таким образом, когда мне нужно, я могу переключать showC из ViewB со следующим результатом:

  • Представление B закрыто
  • Представление C нажимается и отображается
  • Просмотр C тоже отклонен :(

Что мне делать, чтобы ViewC не закрылся автоматически?


person DarkByte    schedule 14.02.2021    source источник


Ответы (1)


Вот демонстрация возможного решения. Подготовлено и протестировано с Xcode 12.4 / iOS 14.4.

Идея состоит в том, чтобы управлять навигацией на стороне корневого представления, потому что изменения во внутреннем состоянии NavigationView кажутся запутанными в момент модификации.

демо

class NavRouteModel: ObservableObject {
    @Published var currentTag: Int?
}

struct TestNavigationTriangle: View {
    @StateObject private var vm = NavRouteModel()
    
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink("ViewB", destination: ViewB {
                    self.vm.currentTag = 0
                    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
                        self.vm.currentTag = 2
                    }
                }, tag: 1, selection: $vm.currentTag)
                NavigationLink("ViewC", destination: Text("ViewC"), tag: 2, selection: $vm.currentTag)
            }
        }
    }
}

struct ViewB: View {
    var completed: () -> () = {}
    
    var body: some View {
        Button("Complete & Go to ViewC", action: completed)
    }
}
person Asperi    schedule 14.02.2021
comment
Итак, согласно вашему ответу, у этого вопроса такая же проблема, Мне интересно, почему это действие сбивает состояние с толку, это похоже на ошибку? - person egeeke; 14.02.2021