#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, спасибо за ответ. Первое предложение не сработало, но второе сработало.