it-swarm.com.ru

Передача данных между ViewController и TabBarController

У меня есть пара вопросов. Как передать данные (которые я получил после завершения запроса Alamofire) одному из потомков TabBarController?

Первая проблема, с которой я столкнулся, заключается в том, что я не могу переопределить функцию func prepareForSegue внутри действия входа в систему (при нажатии кнопки), он говорит, что я могу переопределить только члены класса. Но если я поставлю функцию за пределами IBAction, я не буду отправлять данные, которые мне нужны.

И вторая проблема, когда я помещаю переопределенную функцию за пределы IBAction, и код выглядит так:

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {

            let homeVC = segue.destinationViewController as HomeViewController
            homeVC.templateForCell = templates
        }

когда я запускаю его, я получаю сообщение об ошибке:

Не удалось привести значение типа 'UITabBarController' к HomeViewController '

(HomeViewController - мой вид назначения, куда я должен передать данные из Alamofire).

6
anna.O

Вы не обязательно должны использовать prepareForSegue для этого. Просто укажите, какой ViewController в массиве viewBontrollers TabBarController вы хотите, и приведите его.

let vc = self.tabBarController.viewControllers![1] as! HomeViewController
vc.templateForCell = templates

Если ViewControllers в вашем TabBar встроены в Navigation Controllers, вы можете сделать это:

let navController = self.tabBarController.viewControllers![1] as! UINavigationController
let vc = navController.topViewController as! HomeViewController
vc.templateForCell = templates
12
nighttalker

Для Xcode 8, Swift 3.x вы можете использовать что-то вроде следующего. Это предполагает, что у вас есть контроллер представления, встроенный в контроллер навигации. В моей ситуации я пытаюсь установить для переменной с именем startWizard значение true при переходе из нового представления настройки пользователя.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "segueFromNewUserToDashboard") {
        let dashboardController = segue.destination as! MyTabBarController
        for viewController in dashboardController.viewControllers! {
            let navViewController = (viewController as! MyNavigationController).topViewController!
            if (navViewController.isKind(of: DashboardViewController.self) == true) {
                (navViewController as! DashboardViewController).startWizard = true
                break
            }
        }
    }
}
2
Dave Stevens