web-dev-qa-db-ja.com

Swift Navigation Controllerを介してデータを渡す

私のセグエの1つは、View ControllerからTableView Controllerへの移行です。 2つの間で配列を渡したいのですが、TableView Controllerの前にNavigation Controllerがあると、配列を渡す方法がわかりません。どのようにnavigatiomコントローラーを介してtableviewコントローラーにデータを渡しますか?

60
user3142972

prepareForSegueをオーバーライドし、必要なテーブルビューの値を設定します。 UINavigationviewControllersプロパティからテーブルビューを取得できます。

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

   let navVC = segue.destinationViewController as UINavigationController

   let tableVC = navVC.viewControllers.first as YourTableViewControllerClass

   tableVC.yourTableViewArray = localArrayValue   
}

Swift 3:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

   let navVC = segue.destination as? UINavigationController

   let tableVC = navVC?.viewControllers.first as! YourTableViewControllerClass

   tableVC.yourTableViewArray = localArrayValue   
}
116
Tommy Devoy

@Tommy Devoyの答えは正しいですが、ここではSwift 3

更新済みSwift

  // MARK: - Navigation

//In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.


    if segue.identifier == "yourSegueIdentifier"  {

        if let navController = segue.destination as? UINavigationController {

            if let chidVC = navController.topViewController as? YourViewController {
                 //TODO: access here chid VC  like childVC.yourTableViewArray = localArrayValue 


            }

        }

    }

}
21

私はこれを受け取っていましたerror Horatioのソリューションに。

ERROR: Value of type 'UINavigationController' has no member 'yourTableViewArray'

したがって、これは私のような他の人がcodeのみのソリューションを探している場合に役立ちます。ナビゲーションコントローラーにリダイレクトしたいのですが、そのNavコントローラー内のルートビューコントローラーにデータを渡しました。

if let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "yourNavigationControllerID") as? UINavigationController,
   let yourViewController = controller.viewControllers.first as? YourViewController {
        yourViewController.yourVariableName = "value"
        self.window?.rootViewController = controller  // if presented from AppDelegate
        // present(controller, animated: true, completion: nil) // if presented from ViewController
}
10
mythicalcoder

トミーのソリューションでは、ストーリーボードでセグエを設定する必要があります。

コードのみのソリューションは次のとおりです。

func functionToPassAsAction() {
    var controller: UINavigationController
    controller = self.storyboard?.instantiateViewControllerWithIdentifier("NavigationVCIdentifierFromStoryboard") as! UINavigationController 
    controller.yourTableViewArray = localArrayValue
    self.presentViewController(controller, animated: true, completion: nil)
}
8
Horatio

Swift 3(テスト済みソリューション)-VC-NavigationControllerを使用したセグエ間のデータの受け渡し

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        let navigationContoller = segue.destination as! UINavigationController

        let receiverViewController = navigationContoller?.topViewController as ReceiverViewController

        receiverViewController.reveivedObject = sentObject 
    }
6
LamaTo

Swiftの固定構文

  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let navVC = segue.destination as! UINavigationController
        let tableVC = navVC.viewControllers.first as! YourTableViewControllerClass

        tableVC.yourTableViewArray = localArrayValue
    }
3
MANISH PATHAK