J'ai deux VC: VC1 et VC2. Dans VC1, j'ai un finish button
que j'ai créé par programme et un result array
Je veux passer à VC2.
Je sais comment faire Segue dans Storyboard, mais je ne peux pas faire ça pour le moment depuis le finish button
est créé par programme.
Si je veux passer un tableau de résultats en utilisant segue, existe-t-il un moyen de faire la séquence par programme? Si ce n'est pas possible, dois-je simplement présenter VC2 en utilisant presentViewController
et définir un délégué pour passer le result array
?
Vous pouvez le faire comme proposé dans cette réponse: InstantiateViewControllerWithIdentifier .
De plus, je vous fournis le code de la réponse liée réécrite en Swift parce que la réponse dans le lien a été initialement écrite en Objective-C.
let vc = UIStoryboard(name:"Main", bundle:nil).instantiateViewControllerWithIdentifier("identifier") as! SecondViewController
vc.resultsArray = self.resultsArray
self.navigationController?.pushViewController(vc, animated:true)
MODIFIER:
Étant donné que cette réponse attire l'attention, j'ai pensé vous proposer un autre moyen plus sûr. Dans la réponse ci-dessus, l'application se bloquera si le ViewController
avec "identifiant" n'est pas de type SecondViewController
. Dans Swift vous pouvez éviter ce plantage en utilisant une liaison facultative:
guard let vc = UIStoryboard(name:"Main", bundle:nil).instantiateViewControllerWithIdentifier("identifier") as? SecondViewController else {
print("Could not instantiate view controller with identifier of type SecondViewController")
return
}
vc.resultsArray = self.resultsArray
self.navigationController?.pushViewController(vc, animated:true)
De cette façon, le ViewController
est poussé s'il est de type SecondViewController
. Si ne peut pas être casté en SecondViewController
un message est imprimé et l'application reste sur le ViewController
en cours.
Vous pouvez toujours créer la séquence dans Interface Builder en faisant glisser de VC1 vers VC2 - faites simplement glisser de/vers le petit cercle jaune en haut du VC. Donnez à cette séquence un nom unique dans IB, et dans votre fonction finish
, vous pouvez appeler performSegueWithIdentifier:
, passez le nom de votre enchaînement, et c'est tout. Dans la méthode prepareForSegue
, vous pouvez savoir quelle séquence est effectuée en accédant à segue.identifier
, et si c'est la séquence en question, vous pouvez obtenir un pointeur sur segue.destinationViewController
et transmettez vos données de cette façon.