У меня есть контроллер панели вкладок в моем приложении с 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 «родителя» из цепочки.
ДОЛЖЕН быть лучший способ сделать это... Моя архитектура неверна? Как я могу перейти на панель вкладок из встроенного представления, если я не знаю, сколько представлений в пути?
У ViewController
уже есть свойство tabBarController
с описанием как
// If the view controller has a tab bar controller as its ancestor, return it. Returns nil otherwise.
так что вы можете напрямую получить доступ к TabBar
Controller
, в который встроен ваш viewController,
self.tabBarController?.selectedIndex = 2
Я чувствую себя идиотом сейчас. Я почему-то думал, что не получится получить к нему доступ, если я не нахожусь в tabBarViewController. Спасибо, добрый сэр!
@MartaPanuszewska Неважно, это часть процесса. Продолжать работать :)
я не думаю, что это будет работать для контроллеров, встроенных в представления контейнеров.