Je rencontre plusieurs contrôleurs de vue dans mon application. Je veux masquer navigationbar
dans mon premier contrôleur de vue. J'utilise donc le code suivant pour masquer la barre de navigation
navigationController?.setNavigationBarHidden(navigationController?.navigationBarHidden == false, animated: true);
Maintenant, je veux ajouter une barre de navigation dans un autre viewController mais ma barre de navigation n’est pas visible dans ce viewcontroller. Pourquoi ça se passe?
Mon storyboard montre la barre de navigation mais une fois que j'essaie d'exécuter mon application, elle est partie.
Si je cache la barre de navigation d'un contrôleur de vue, nous ne pouvons pas utiliser le contrôleur de navigation, est-ce vrai? J'espère que je me trompe. Alors quelles sont les raisons pour lesquelles la barre de navigation n'est pas affichée?
MODIFIER:
De plus, je veux que mon contrôleur de vue soit en mode portrait uniquement. Donc j'ai fait ce qui suit est ce qui cause le problème?
extension UINavigationController{
public override func shouldAutorotate() -> Bool {
if (UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeLeft ||
UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeRight ||
UIDevice.currentDevice().orientation == UIDeviceOrientation.Unknown) {
return false
}
else {
return true
}
}
public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return [UIInterfaceOrientationMask.Portrait ,UIInterfaceOrientationMask.PortraitUpsideDown]
}
}
Éditer 1:
J'utilise le code suivant pour passer d'un contrôleur de vue et non d'un lien au storyboard. Est-ce que cela cause problème maintenant?
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let secondViewController = storyboard.instantiateViewControllerWithIdentifier("HomeVC")
presentViewController(secondViewController, animated: false, completion: nil)
Edit 2:
S'il vous plaît vérifier mes captures d'écran suivantes. Quels sont mes paramètres pour le contrôleur secondview
Edit 3:
Voici l'inspecteur des attributs du contrôleur de navigation
Le contrôleur de navigation est un contrôleur qui possède une pile de contrôleurs de vue. Donc, si vous avez quelque chose comme ça:
NAV -> A -> (transition) B
Même si vous cachez la barre de navigation, vous devriez quand même être capable de faire la suite. Aussi, ne pouvez-vous pas simplement afficher la barre de navigation dans le second contrôleur de vue (viewBillAppear)? Et dans un premier temps de la même manière, masquez-le dans viewWillAppear.
edit: Solution finale au problème: Utilisez:
let controller = storyboard.instantiateViewControllerWithIdentifier("HomeVC")
self.navigationController!.pushViewController(controller)
au lieu de:
let secondViewController = storyboard.instantiateViewControllerWithIdentifier("HomeVC")
presentViewController(secondViewController, animated: false, completion: nil)
Parce que pushViewController ajoutera secondViewController à sa pile. presentViewController remplaçait votre contrôleur de navigation, c'est pourquoi vous ne pouviez pas voir la barre de navigation.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Hide the navigation bar on the this view controller
self.navigationController?.setNavigationBarHidden(true, animated: animated)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// Show the navigation bar on other view controllers
self.navigationController?.setNavigationBarHidden(false, animated: animated)
}
dans la méthode viewDidLoad du contrôleur de vue dans laquelle vous ne souhaitez pas afficher la barre de navigation, ajoutez la ligne
navigationController.navigationBarHidden = true
vous vous cachez actuellement dans tous les contrôleurs de vue
Edit: vous présentez le contrôleur de vue à la place, il devrait être
self.navigationController!.pushViewController(controller)
J'ai les mêmes exigences dans mon projet Swift.
c'est comme ça que j'ai géré la barre de navigation
Assurez-vous que votre premier écran est intégré au contrôleur de navigation.
par exemple, nous avons deux écrans A et B
Dans l'écran A, vous devez masquer la barre de navigation dans viewWillAppear
override func viewWillAppear(animated: Bool)
{
super.viewWillAppear(animated)
//hide navigation for screen A
self.navigationController?.navigationBarHidden = true
}
pour activer la navigation dans l'écran Bvous devez ajouter le code ci-dessous dans l'écran A
override func prepareForSegue(segue: (UIStoryboardSegue!), sender: AnyObject!)
{
if (segue.identifier == "screen B's segue identifier here")
{
//enable navigation for screen B
navigationController?.setNavigationBarHidden(navigationController?.navigationBarHidden == false, animated: true)
}
}
En utilisant le style ci-dessus, je peux activer ou désactiver la barre de navigation pour un écran spécifique, à tout moment
Si vous devez masquer cette barre de navigation uniquement dans ce contrôleur, le meilleur moyen consiste à l'afficher dans viewWillDisappear()
et à le masquer dans viewWillAppear()
.
faire comme dans viewcontroller
basé caché en utilisant Swift 4.0
Pour masquer navigationController
dans viewWillAppear
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.isNavigationBarHidden = true
}
Pour afficher navigationController
dans viewWillDisappear
override func viewWillDisappear(animated: Bool)
{
super.viewWillDisappear(animated)
self.navigationController?.isNavigationBarHidden = false
}
Il est trop tard pour répondre et il y a d'autres bonnes réponses mais j'aimerais partager ce qui a fonctionné pour moi.
let controller = self.storyboard?.instantiateViewControllerWithIdentifier("HomeVC")
self.navigationController!.pushViewController(controller!, animated:true)