web-dev-qa-db-fra.com

Faire Segue par programmation dans Swift

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?

17
Kahsn

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.

28
dehlen

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.

8
creeperspeak