Как проверить, находится ли конкретный UIViewController(встроенная панель вкладок) в стойке NavigationController?

#ios #swift #uiviewcontroller #uinavigationcontroller #uitabbar

Вопрос:

У меня есть SignInVc в качестве отправной точки и кнопка «Пропустить». Если пользователь нажимает «Пропустить», e переходит на домашнюю страницу, и когда он нажимает любую кнопку, его толкают на вход в систему.

В HomeVC есть панель вкладок, как и в одной из 4-х панелей вкладок Vc.

                    if let viewControllers = self.navigationController?.viewControllers {
                        for controller in viewControllers
                        {
                            if controller == (tabBarController?.viewControllers![0]){
                                print("FOUND IT")
                            }
                            print(controller)
                        }
                    }
 

Во время отладки с точками останова я могу видеть домашнюю страницу в NavigationController?.Контроллеры просмотра

Но я не могу получить к нему доступ!!, печать не выполняется. Что я должен использовать в RHS == ?

План состоит в том, чтобы перейти на домашнюю страницу вместо кода печати.

Редактировать:

Я добавляю скриншоты отладки ниже

Здесь я хочу добраться до контроллера вида по индексу 2

раскадровка на панели вкладок

Главная раскадровка

[Окно отладки][1]

Отлаживать

Комментарии:

1. Пожалуйста, добавьте экран с вашей иерархией в раскадровку или код, где вы выделяете TabBarController, навигационный контроллер и HomeViewController

Ответ №1:

Я не думаю, что у вас есть такая иерархия, как вы описали. Действительно, у тебя есть

 NavigationController -> TabBarController -> HomeViewController or
TabBarController -> NavigationController -> HomeViewController
 

Свойства .navigationController и .tabBarController найдите ближайший доступный контроллер навигации и панели вкладок.
Просто изучите свою иерархию в раскадровке или в коде, и вы решите свою проблему.

UPD.
Основываясь на вашем экране, вы должны сначала найти контроллер панели вкладок и найти HomeViewController в TabBarController. Я думаю, что код должен выглядеть так:

 if let tabBar = navController.viewControllers.first(where: { $0 is UITabBarController} ){
    let homeController = tabController.viewControllers?.first(where: { $0 is HomeViewController})
    print("Home controller: (home)")
}
 

Комментарии:

1. Его в «NavigationController -> TabBarController ->> HomeViewController»

2. Я обновил свой ответ, который вы должны найти в массиве ViewControllers панели вкладок, а не в массиве ViewControllers navBarController.

3. я там получаю ноль,

Ответ №2:

Я не уверен, прав ли я,

логически объявите глобальную переменную,

var initiateHomePage: Bool? // объявить выше или вне любого файла swift

Для действий с кнопками

случай 1

   @IBAction func skipButtonTapped(_ sender: Any) {
      initiateHomePage = true // should go homepage
    
    }
 

случай 2

   @IBAction func anyButtonTapped(_ sender: Any) {
      initiateHomePage = false // should go SignInVC
    
    }
 

Наконец

во время выполнения

   if initiateHomePage == true {
      // redirect to home page
      // use this to redirect to tab bar 
       if let viewControllers = self.navigationController?.viewControllers {
                            for controller in viewControllers
                            {
                                if controller == (tabBarController?.viewControllers![0]){
                                    print("FOUND IT")
                                }
                                print(controller)
                            }
                        } 

    //  or use this 
    let ViewController:UIStoryboard = UIStoryboard(name: "Module", bundle: nil)
        let tabBarController = ViewController.instantiateViewController(withIdentifier: "tabBar") as! UITabBarController
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.window?.rootViewController = tabBarController
     
    } else {
      // redirect to SignINVC 
     
    }