web-dev-qa-db-fra.com

Swift naviguer par programme vers un autre contrôleur de vue / scène

J'utilise le code suivant pour naviguer par programme vers un autre ViewController. Cela fonctionne bien, mais cela masque comment le navigation bar. Comment puis-je résoudre ce problème? (la barre de navigation est créée en incorporant la ViewController dans le navigation controller si cela compte.)

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("nextView") as NextViewController
self.presentViewController(nextViewController, animated:true, completion:nil)
56
Victor

Dans Swift

Avec un contrôleur créé par programme

Si vous souhaitez accéder au contrôleur créé par programme, procédez comme suit:

let newViewController = NewViewController()
self.navigationController?.pushViewController(newViewController, animated: true)

Avec un contrôleur créé par StoryBoard

Si vous souhaitez accéder à Controller sur StoryBoard avec l'identificateur "newViewController", procédez comme suit:

let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "newViewController") as! NewViewController
        self.present(newViewController, animated: true, completion: nil)
148
jaiswal Rajan

Swift 4.x

Les chaînes entre guillemets me confondent toujours, alors je pense que la réponse à cette question nécessite une présentation graphique pour résoudre ce problème.

Pour une application bancaire, j'ai un LoginViewController et un BalanceViewController. Chacun a ses écrans respectifs.

L'application démarre et affiche l'écran de connexion. Lorsque la connexion est réussie, l'application ouvre l'écran Balance.

Voici à quoi ça ressemble:

enter image description here

enter image description here

Le succès de la connexion est traité comme suit:

let storyBoard: UIStoryboard = UIStoryboard(name: "Balance", bundle: nil)
let balanceViewController = storyBoard.instantiateViewController(withIdentifier: "balance") as! BalanceViewController
self.present(balanceViewController, animated: true, completion: nil)

Comme vous pouvez le constater, l'ID du storyboard "balance" en minuscules correspond à la deuxième ligne du code. Il s'agit de l'ID défini dans les paramètres du storyboard, comme dans la capture d'écran ci-jointe.

Le terme 'Balance' avec le majuscule 'B' est le nom du fichier storyboard, utilisé dans la première ligne du code.

Nous savons que l'utilisation de chaînes codées en dur dans le code est une très mauvaise pratique, mais d'une manière ou d'une autre dans le développement iOS, cela est devenu une pratique courante, et Xcode ne met même pas en garde à leur sujet.

19
zeeshan

Vous devez pousser le nouveau contrôleur de vue en utilisant le contrôleur de navigation actuel, non présent.

self.navigationController.pushViewController(nextViewController, animated: true)
13
ocanal

Selon @jaiswal Rajan dans sa réponse . Vous pouvez faire un pushViewController comme ceci:

let storyBoard: UIStoryboard = UIStoryboard(name: "NewBotStoryboard", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "NewViewController") as! NewViewController
self.navigationController?.pushViewController(newViewController, animated: true)
9
Andres Paladines

Donc, si vous présentez un contrôleur de vue, il ne s'affichera pas dans le contrôleur de navigation. Il faudra juste prendre écran complet. Dans ce cas, vous devez créer un autre contrôleur de navigation, ajouter votre nextViewController en tant que racine et présenter ce nouveau contrôleur de navigation.

Une autre méthode consiste simplement à appuyer sur le contrôleur de vue.

self.presentViewController(nextViewController, animated:true, completion:nil)

Pour plus d’informations, consultez la documentation Apple: - https://developer.Apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//Apple_ref/doc/uid/TP40006926 -CH3-SW96

3
Aks
OperationQueue.main.addOperation {
   let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
   let newViewController = storyBoard.instantiateViewController(withIdentifier: "Storyboard ID") as! NewViewController
   self.present(newViewController, animated: true, completion: nil)
}

Cela a fonctionné pour moi lorsque je mets le code à l'intérieur du OperationQueue.main.addOperation, qui s'exécutera dans le thread principal pour moi.

0
Pedro Berbel