2016-09-14 19 views
4

私はいくつかの質問があります。 Alamofireリクエストが終了した後のデータをTabBarControllerの子のいずれかに渡すにはどうすればいいですか?ViewControllerとTabBarControllerの間でデータを渡す

最初の問題は、(ボタンがタップされたとき)ログインアクション内でfunc prepareForSegueをオーバーライドできないことです。クラスメンバーだけをオーバーライドできると言います。しかし、私がIBActionの外にfuncを置くと、私は必要なデータを送信しません。

と私はIBActionの外でオーバーライド機能を入れたときに、第2の問題は、あり、そしてコードは次のようになります。

Could not cast value of type 'UITabBarController' to HomeViewController'

:私はそれを実行したとき、私はエラーを得

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

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

(HomeViewControllerは私の宛先ビューです.Alamofireからデータを渡す必要があります)。

+0

あなたは 'UITabBarController'の' viewControllers'プロパティを見て、それらのどれかがあなたに送る必要があるオブジェクトの種類であるかどうかを見ることができます。 –

答えて

6

必ずしもこのためにprepareForSegueを使用する必要はありません。どのViewControllerをTabBarControllerのviewControllers配列で参照し、それをキャストするだけです。

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

あなたのTabBarでViewControllersは、ナビゲーションコントローラに組み込まれている場合は、これを行うことができます:Xcodeの8、あなたは次のようなものを使用することができスウィフト3.xの

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

しかし、私はエラー '致命的なエラーが発生しました:オプション値をアンラッピングしている間に予期せずnilが見つかりました' –

+0

このコードをviewDidLoadに入れ、xcodeの出力を確認してください: 'print(tabBarController?.viewControllers)' – nighttalker

1

を。これは、あなたのビューコントローラがナビゲーションコントローラに組み込まれていることを前提としています。私の状況では、新しいユーザー設定ビューからナビゲートするときに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 
      } 
     } 
    } 
} 
関連する問題