Как перейти к панели вкладок из встроенного представления?

#swift #uitabbarcontroller #navigationcontroller

#swift #uitabbarcontroller #navigationcontroller

Вопрос:

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

Раскадровка панели вкладок
Просмотр раскадровки

Как в пустом представлении, так и в представлении с данными у меня есть кнопка, которая должна «щелкнуть» одну из кнопок на панели вкладок (переключиться на другую вкладку).

На данный момент это то, что я делаю:

Отображение представления с данными:

 class EmptyTasksVC: ViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        if(there_is_data){
            let storyboard = UIStoryboard(name: "TaskTodoList", bundle: nil)
            let vc = storyboard.instantiateViewController(withIdentifier: "TaskListSegmentedControl")

            let childNavigation = UINavigationController(rootViewController: vc)
            childNavigation.willMove(toParent: self)
            addChild(childNavigation)
            childNavigation.view.frame = view.frame
            view.addSubview(childNavigation.view)
            childNavigation.didMove(toParent: self)
         }
    }
}
  

Поиск панели вкладок при нажатии кнопки из представления с данными:

 @objc func newTaskAction(sender: UIButton!) {
    let viewController = self.findViewController()
    let tabBar = viewController?.parent?.parent?.parent?.parent?.parent as! UITabBarController
    tabBar.selectedIndex = 2
}
...

extension UIView {
    func findViewController() -> UIViewController? {
        if let nextResponder = self.next as? UIViewController {
            return nextResponder
        } else if let nextResponder = self.next as? UIView {
            return nextResponder.findViewController()
        } else {
            return nil
        }
    }
}
  

Если я хочу перейти к кнопке из пустого представления, я должен удалить 2 «родительских элемента» из цепочки.

Должен быть лучший способ сделать это… Моя архитектура неправильная? Как я могу перейти к панели вкладок из встроенного представления, если я не знаю, сколько просмотров находится в пути?

Ответ №1:

У A ViewController уже есть свойство tabBarController с описанием как

// Если контроллер представления имеет контроллер панели вкладок в качестве своего предка, верните его. В противном случае возвращает nil .

таким образом, вы можете напрямую получить доступ к TabBar Controller вашему ViewController, встроенному в,

 self.tabBarController?.selectedIndex = 2
  

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

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

2. Теперь я чувствую себя идиотом. По какой-то причине я думал, что получить к ней доступ будет невозможно, если я не в tabBarViewController. Спасибо, добрый сэр!

3. @MartaPanuszewska Неважно, это часть процесса. Продолжайте работать 🙂