web-dev-qa-db-fra.com

Swift transmettre des données via le contrôleur de navigation

Une de mes séquences passe d'un contrôleur de vue à un contrôleur de table. Je souhaite passer un tableau entre les deux, mais avec un contrôleur de navigation avant le contrôleur tableview, je ne vois pas comment passer du tableau. Comment passez-vous les données via un contrôleur de navigation à un contrôleur tableview?

60
user3142972

Remplacez prepareForSegue et définissez la valeur de la vue de table souhaitée. Vous pouvez récupérer la vue de table à partir de la propriété UINavigationviewControllers.

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

   let navVC = segue.destinationViewController as UINavigationController

   let tableVC = navVC.viewControllers.first as YourTableViewControllerClass

   tableVC.yourTableViewArray = localArrayValue   
}

Pour 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

La réponse de @Tommy Devoy est correcte mais voici la même chose dans Swift 3

Mise à jour 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

J'obtenais ceci erreur à la solution de Horatio.

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

Cela pourrait donc aider d'autres personnes comme moi à la recherche d'une solution code seulement. Je voulais rediriger vers un contrôleur de navigation, mais transmettre des données au contrôleur de vue racine dans ce contrôleur de navigation.

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

La solution de Tommy nécessite que vous configuriez la Segue dans Storyboard.

Voici une solution uniquement en code:

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 (solution testée) - Transmission de données entre VC - Segue avec 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

syntaxe FIXED pour 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