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)
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)
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:
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.
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)
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)
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
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.