В моем приложении есть контроллер панели вкладок, который имеет 4 вкладки. Предполагается, что одна из них отображает одну из двух сцен на основе ответа от 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 «родителей» из цепочки.
Должен быть лучший способ сделать это ...
Моя архитектура не так? Как получить доступ к панели вкладок из встроенного представления, если я не знаю, сколько представлений в пути?