Я сослался на эту ветку переполнения стека SwiftUI Как открыть представление root.
Однако в моем случае это не работает, конечно, ни один ответ не подходит для каждого случая использования, поэтому всегда нужно немного изменить ответ, но, конечно, придерживаясь общей схемы решения.
Я просмотрел эту ветку Как открыть несколько представлений из стека навигации, но я не уверен, что сброс сцены - лучший вариант? Должен быть нормальный способ?
Решение, которое я выбрал, - использовать ObservableObject и установить его как EnvironmentObject корневого представления.
Стек навигации увеличивается на 4 вида:
RootView().environmentObject(AppSettings.shared)
FirstView()
SecondView()
ThirdView()
FourthView()
Состояние NavigationLink isActive
для FirstView определено в AppSettings.shared
, все остальные состояния находятся в последующем представлении, а не в AppSettings. Например: FirstView -> SecondView
состояние SecondView isActive
определено в модели представления FirstView
, и так далее и тому подобное.
Я пытаюсь перейти к RootView из FourthView. Итак, в FourthView есть переменная environmentObject типа AppSettings (переданная как EnvironmentObject из RootView), и при нажатии кнопки переключите состояние RootView - ›FirstView isActive на false.
Он переключается, но нет навигации. Однако в консоли отладки это ошибка
Trying to pop to a missing destination at /Library/Caches/com.apple.xbs/Sources/Monoceros/Monoceros-42.24.100/Shared/NavigationBridge_PhoneTV.swift:205
Насколько я понимаю, переключение этого состояния на false должно запускать навигацию обратно, но в потоке переполнения стека было сообщение об использовании переменной @State
из RootView -> FirstView
, а в EnvironmentObject есть переменная moveToDashbord
. Затем на RootView
добавьте модификатор .onReceive
для прослушивания moveToDashboard
издателя и затем активируйте переменную @State
. Но опять же, это также приводит к тому же сообщению консоли отладки.
Короче говоря, все решения приводят к отсутствию сообщения консоли назначения. Это потому, что навигация слишком глубокая?
Это проект только для iPad, и для стиля navigationView задано значение StackedNavigationStyle.
Сведения о системе:
Xcode 11.6
iOS / PadOS Target 13.0 (чтобы не использовать SwiftUI 2.0, если это так)
Примеры кода:
Это SceneDelegate, который устанавливает AppSettings как общесистемный EnvironmentObject.
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
let contentView = LoginView().environmentObject(AppSettings.shared)
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
}
}
Это пример перехода по ссылке на RootView.
NavigationLink(destination: RootView().navigationBarBackButtonHidden(true), isActive: self.$loginViewModel.loginSuccess) {
EmptyView()
}
Это пример навигации по ссылке из RootView - ›FirstView:
NavigationLink(destination: FirstView().environmentObject(FirstViewModel()), isActive: self.$appSettings.firstView) {
EmptyView()
}.isDetailLink(false)
Примечание. Для ясности мне пришлось изменить фактические названия видов.