Pu sh навигационный контроллер в навигационный контроллер - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть ViewController, который состоит из экранов, построенных программно. Допустим, FirstV c. При нажатии кнопки «Я хочу» в окне «Навигационный контроллер с моего раскадровки» (как видно на рисунке)

Как видно на рисунке, мой SecondViewController встроен в контроллер навигации

С моим текущим кодом в забаве OnButtonClick c. Выдает ошибку не может pu sh контроллер навигации, внутренний контроллер навигации. Что является правдой. Но если я только создаю экземпляр ViewController с моей главной панели, я не смогу видеть верхнюю панель навигации.

Кроме того, я не хочу использовать .present, так как я хочу изменить все окно. Квадратные скобки, представляющие раскадровку.

FirstV c <---> [Navigatiob-> Tab-> SecondVC]

Каковы возможные способы получения ссылки, представленной пунктирные линии?

Делегат сцены

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
            guard let windowScene = (scene as? UIWindowScene) else { return }
//            
                    window = UIWindow(frame: windowScene.coordinateSpace.bounds)
                    window?.windowScene = windowScene

                    let navigation = AppNavigationView()

                    let viewController  = ViewController()

    navigation.pushViewController(viewController, animated: true)
                    window?.rootViewController = navigation
                    window?.makeKeyAndVisible()

}

Функция в ViewController

    @objc func buttonTapped(){

        let viewController  = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "navC") as! UINavigationController
        navigationController?.pushViewController(viewController, animated: true)
        self.present(viewController, animated:true, completion:nil)

        print("button tapped")
    }

Журнал ошибок

- Перешел в активное состояние --- 2020-04-02 20: 49: 43.978018 + 0530 Snug [13340: 370457] * Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Нажатие контроллера навигации не поддерживается * стек вызовов первого выброса:

Ответы [ 3 ]

0 голосов
/ 02 апреля 2020

Есть ряд вещей, которые здесь кажутся неправильными. Вы не устанавливаете ViewController как rootViewController из NavigationController. И вы пытаетесь создать sh новый ViewController, который является еще одним NavigationController. Вот что вам нужно.

Первый: UISceneDelegate.swift

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let windowScene = scene as? UIWindowScene else { return }
    window = UIWindow(windowScene: windowScene)
    window?.rootViewController = UINavigationController(rootViewController: FirstViewController())
    window?.makeKeyAndVisible()
}

Второй: ViewController.swift

@objc func navigate() {
    tabBarController?.navigationController?.pushViewController(SecondViewController(), animated: true)
}

Примечание: SecondViewController имеет тип UIViewController, а не UINaviationViewController .

0 голосов
/ 02 апреля 2020

В функции navigate сначала установите второй контроллер с константой let, после этого вызовите его в pushViewController:

@objc func navigate() {
 let secondController = SecondViewController() 
 navigationController?.pushViewController(secondController, animated: true)
}

естественно установите делегата сцены следующим образом

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let windowScene = (scene as? UIWindowScene) else { return }
    window = UIWindow(windowScene: windowScene)
    window?.makeKeyAndVisible()
    let vC = UINavigationController(rootViewController: ViewController())
    window?.rootViewController = vC
}
0 голосов
/ 02 апреля 2020

Похоже, вы создаете экземпляр контроллера навигации из раскадровки. Получить контроллер вида сверху.

@objc func buttonTapped(){

    let viewController  = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "navC") as! UINavigationController
    if let top = viewController.topViewController {
        navigationController?.pushViewController(top, animated: true)
    }

    print("button tapped")
}
...