[ios] Instancier et présenter un viewController dans Swift



4 Answers

Pour les personnes utilisant la réponse de @ akashivskyy pour instancier UIViewController et qui ont l'exception:

Erreur fatale: utilisation de l'initialiseur 'init (coder :)' non implémenté pour la classe

Conseil rapide:

required init?(coder aDecoder: NSCoder) manuellement required init?(coder aDecoder: NSCoder) à votre UIViewController destination que vous essayez d'instancier

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

Si vous avez besoin de plus de description s'il vous plaît se référer à ma réponse here

Question

Problème

J'ai commencé à regarder le nouveau Swift sur Xcode 6 , et j'ai essayé quelques projets de démonstration et des tutoriels. Maintenant je suis coincé à:

Instanciation et présentation d'un viewController partir d'un storyboard spécifique

Solution Objective-C

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"myStoryboardName" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"myVCID"];
[self presentViewController:vc animated:YES completion:nil];

Comment réaliser cela sur Swift?




Je sais que c'est un vieux fil, mais je pense que la solution actuelle (en utilisant l'identificateur de chaîne codée en dur pour le contrôleur de vue donné) est très sujette aux erreurs.

J'ai créé un script de temps de construction (auquel vous pouvez accéder ici ), qui créera un compilateur sécurisé pour accéder et instancier les contrôleurs de vue de tous les storyboards du projet.

Par exemple, le contrôleur de vue nommé vc1 dans Main.storyboard sera instancié comme suit :

let vc: UIViewController = R.storyboard.Main.vc1^  // where the '^' character initialize the controller



Peu importe ce que j'ai essayé, ça ne marcherait pas pour moi - pas d'erreurs, mais pas de nouveau contrôleur de vue sur mon écran non plus. Je ne sais pas pourquoi, mais l'emballer dans la fonction de temporisation a finalement fait fonctionner:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.0) {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let controller = storyboard.instantiateViewController(withIdentifier: "TabletViewController")
    self.present(controller, animated: true, completion: nil)
}



Réponse d'Akashivskyy fonctionne très bien! Mais, au cas où vous auriez du mal à revenir du contrôleur de vue présenté, cette alternative peut être utile. Cela a fonctionné pour moi!

Rapide:

let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("someViewController") as! UIViewController
// Alternative way to present the new view controller
self.navigationController?.showViewController(vc, sender: nil)

Obj-C:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyStoryboardName" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"someViewController"];
[self.navigationController showViewController:vc sender:nil];



Si vous voulez le présenter de manière modale, vous devriez avoir quelque chose comme:

let vc = self.storyboard!.instantiateViewControllerWithIdentifier("YourViewControllerID")
self.showDetailViewController(vc as! YourViewControllerClassName, sender: self)





Related