Отсутствует пункт назначения при открытии корневого просмотра

Я сослался на эту ветку переполнения стека 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)

Примечание. Для ясности мне пришлось изменить фактические названия видов.


person Alexander    schedule 27.07.2020    source источник
comment
Нужен пример для проверки. Как создать минимальный воспроизводимый пример   -  person Asperi    schedule 27.07.2020
comment
Позвольте мне создать один   -  person Alexander    schedule 27.07.2020
comment
Он работает в чистом проекте ... определенно что-то не так с моей реализацией где-то тогда или какой-то элемент пользовательского интерфейса в представлениях вызывает сбой.   -  person Alexander    schedule 27.07.2020


Ответы (1)


Я обнаружил проблему, в одном из представлений был UIViewControllerRepresentable, обернутый UIAlertController. Он был структурирован как модификатор представления с предоставлением содержимого.

Это в основном обернулось вокруг исходного представления, что привело к поломке стека навигации.

Решение заключалось в том, чтобы обернуть UIViewController, который представлен представлением, и в этом ViewController находится UIAlertController.

Это решение для UIAlertController было использовано и адаптировано SwiftUI - UIAlertController

person Alexander    schedule 29.07.2020