#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 Неважно, это часть процесса. Продолжайте работать 🙂