350 votes

Instancier et présenter un viewController en Swift

Numéro

J'ai commencé à jeter un coup d'oeil sur le Swift Programming Language et, d'une manière ou d'une autre, je n'arrive pas à saisir correctement l'initialisation d'un UIViewController à partir d'un UIStoryboard .

Sur Objective-C J'écris simplement :

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"StoryboardName" bundle:nil];
UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"ViewControllerID"];
[self presentViewController:viewController animated:YES completion:nil];

Quelqu'un peut-il m'aider à réaliser cela avec Swift ?

743voto

akashivskyy Points 11508

Cette réponse a été révisée pour Swift 5.4 et iOS 14.5 SDK.


Il s'agit d'une nouvelle syntaxe et d'API légèrement modifiées. La fonctionnalité sous-jacente de UIKit n'a pas changé. Ceci est vrai pour une grande majorité des frameworks SDK iOS.

let storyboard = UIStoryboard(name: "myStoryboardName", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "myVCID")
self.present(vc, animated: true)

Veillez à définir myVCID à l'intérieur du storyboard, sous "Storyboard ID".

3 votes

Vous pouvez même omettre le ; ! ;) Pourriez-vous nous donner plus de détails sur le as UIViewController ? Pourquoi cela est-il nécessaire ?

5 votes

as Le mot-clé est utilisé pour le typecasting. C'est la même chose que (UIViewController *)anObject dans l'objectif c

1 votes

Oui, je sais que je peux les omettre mais ça fait partie de la longue habitude. :D As instantiateViewControllerWithIdentifier renvoie à AnyObject ( id équivalent en Swift) et je déclare vc comme UIViewController je dois faire un casting AnyObject a UIViewController .

45voto

eridb Points 2606

Pour les personnes utilisant La réponse de @akashivskyy pour instancier UIViewController et font l'exception :

erreur fatale : utilisation d'un initialisateur non implémenté 'init(coder :)' pour la classe

Conseil rapide :

Mise en œuvre manuelle required init?(coder aDecoder: NSCoder) à votre destination UIViewController que vous essayez d'instancier

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

Si vous avez besoin d'une description plus détaillée, veuillez vous reporter à ma réponse. aquí

0 votes

Si vous voulez utiliser un initiateur personnalisé, vous pouvez simplement appeler le super avec super.init(nibName : nil, bundle : nil) et l'whew se chargera bien ou l'appeler avec le nom de leur fichier NIB.

4 votes

@user1700737 Je suis en train d'instancier le viewController en faisant référence au storyboard, qui exécute initWithCoder, pas initWithNib. Référez-vous à cette question stackoverflow.com/questions/24036393/

0 votes

Bonjour mes amis, je suis confronté à un problème différent, ce code fonctionne sur le simulateur mais pas sur mon ipad2 qui a iOS v7.1.2. Si cela ne vous dérange pas, aidez-moi à résoudre ce problème.

20voto

Abhijeet B Points 82

Ce lien présente les deux implémentations :

Swift :

let viewController:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ViewController") as UIViewController
self.presentViewController(viewController, animated: false, completion: nil)

Objectif C

UIViewController *viewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"ViewController"];

Ce lien contient le code pour initier un contrôleur de vue dans le même storyboard.

/*
 Helper to Switch the View based on StoryBoard
 @param StoryBoard ID  as String
*/
func switchToViewController(identifier: String) {
    let viewController = self.storyboard?.instantiateViewControllerWithIdentifier(identifier) as! UIViewController
    self.navigationController?.setViewControllers([viewController], animated: false)

}

15voto

Nahuel Roldan Points 423

La réponse de akashivskyy fonctionne très bien ! Mais, au cas où vous auriez des difficultés à revenir du contrôleur de vue présenté, cette alternative peut être utile. Cela a fonctionné pour moi !

Swift :

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];

14voto

Shahzaib Maqbool Points 993

Le code mis à jour de Swift 4.2 est

let storyboard = UIStoryboard(name: "StoryboardNameHere", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "ViewControllerNameHere")
self.present(controller, animated: true, completion: nil)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X