Как попасть на панель вкладок из встроенного представления? - PullRequest
2 голосов
/ 10 апреля 2019

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

Tab bar storyboard Views storyboard

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

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

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

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 Ответ

1 голос
/ 10 апреля 2019

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

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

, чтобы вы могли получить прямой доступ к TabBar Controller, в который встроен ваш viewController,

self.tabBarController?.selectedIndex = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...