Как запустить контроллер при выполнении действия с помощью ESTabBarController

#ios #swift

#iOS #swift

Вопрос:

Я реализовал панель вкладок с помощью ESTabBarController. До сих пор мне удавалось заставить среднюю вкладку запускать модальную, и при нажатии «Добавить» мое приложение создает новую запись. Я пытаюсь перейти к контроллеру Analytics сразу после внесения записи.

Вот мой код. Он находится в AppDelegate ‘s didFinishLaunchingWithOptions .

  let tabBarController = ESTabBarController()
 tabBarController.delegate = self



 let v1 = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "QueryViewController") as! QueryViewController
 let v2 = QueryViewController()
 let v3 = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SettingsViewController") as! SettingsViewController

 v1.tabBarItem   = ESTabBarItem.init(TabBarContentView())
 v2.tabBarItem   = ESTabBarItem.init(TabBarContentView())
 v3.tabBarItem   = ESTabBarItem.init(TabBarContentView())

 v1.tabBarItem.image = UIImage.init(named: "ic_home")
 v2.tabBarItem.image = UIImage.init(named: "ic_new")
 v3.tabBarItem.image = UIImage.init(named: "ic_settings")

 v1.tabBarItem.selectedImage = UIImage.init(named: "ic_home")
 v2.tabBarItem.selectedImage = UIImage.init(named: "ic_new")
 v3.tabBarItem.selectedImage = UIImage.init(named: "ic_settings")

 let n1 = NavigationController.init(rootViewController: v1)
 let n2 = NavigationController.init(rootViewController: v2)
 let n3 = NavigationController.init(rootViewController: v3)

 tabBarController.shouldHijackHandler = {
    tabbarController, viewController, index in
       if index == 1 {
        return true
       }
    return false
 }

 tabBarController.didHijackHandler = {
            [weak tabBarController] tabbarController, viewController, index in
            DispatchQueue.main.asyncAfter(deadline: .now()   0.2) {
                let alert = UIAlertController(title: "New", message: nil, preferredStyle: UIAlertController.Style.alert)
                let addQuery = UIAlertAction(title: "Add", style: .default) { (alertAction) in
                    let textField = alert.textFields![0] as UITextField
                    let newQueryID = UUID().uuidString
                    QueryModel().createNewQuery(id: newQueryID, name: textField.text ?? "")

                    let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "QueryAnalyticsController") as! QueryAnalyticsController;
                    viewController.selectedQueryID = newQueryID

                    // Then push that view controller onto the navigation stack
                    //tabBarController?.navigationController?.pushViewController(viewController, animated: true)
                    //tabBarController?.present(viewController, animated: true)
                }
                alert.addTextField { (textField) in
                    textField.placeholder = "Title"
                }
                alert.addAction(addQuery)
                let cancel = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
                alert.addAction(cancel)
                tabBarController?.present(alert, animated: true, completion: nil)
            }
        }


  tabBarController.viewControllers = [n1, n2, n3]

  self.window?.rootViewController = tabBarController
  

Я пытался

tabBarController?.present(viewController, animated: true)

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

Я также пытался

tabBarController?.navigationController?.pushViewController(viewController, animated: true)

но это не запускает ViewController, как я ожидал.

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

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

Ответ №1:

Заменить

 self.window?.rootViewController = tabBarController
  

с помощью

 self.window?.rootViewController = UINavigationController(rootViewController:tabBarController)
  

Поскольку ваша текущая навигация равна нулю

TabBarController?.NavigationController? <<<<< ноль

Или нажать от дочернего элемента, например

 let nav = tabBarController!.selectedViewController as! UINavigationController

nav.pushViewController(viewController, animated: true)
  

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

1. Привет, Sh_Khan, спасибо за ответ. Первое предложение не сработало, но второе сработало.