J'utilise Xcode 4.6.1 pour coder sur Objective-C. Je souhaite savoir comment conserver la barre de navigation affichée lorsque je crée une transition modale entre 2 contrôleurs de vue, car je fais la transition dans le storyboard et lorsque je lance l'application, la barre de navigation du deuxième contrôleur de vue disparaît J'ai un bouton terminé sur cette barre mais je ne le vois pas.
Les séquences modales occupent l’ensemble de l’écran. Ainsi, les barres de navigation, les barres d’outils et les barres d’onglets se trouvant dans le contrôleur de présentation seront masquées. Si vous souhaitez une barre de navigation sur ce contrôleur modal, vous devez en ajouter une spécifiquement et ajouter les boutons de votre choix à cette nouvelle barre de navigation (ou barre d'outils). Si vous ne voulez pas faire cela, alors ne le présentez pas sous forme modale, faites un Push to it.
Ajoutez simplement un autre Navigation Controller
à votre contrôleur de vue modale. Suis les étapes
Modal View Controller
Editor menu
Embed In
Navigation Controller
Lancer l'application. Maintenant cela devrait fonctionner parfaitement.
J'espère que ceci résoudra votre problème.
Vous pouvez simplement faire ce qui suit pour afficher la barre de navigation:
Objectif c
UINavigationController alloc]initWithRootViewController:modalVC];
Swift 3
let modelVC = self.storyboard?.instantiateViewController(withIdentifier: "modalVC") as! ModalVC
let navBarOnModal: UINavigationController = UINavigationController(rootViewController: modalVC)
self.present(navBarOnModal, animated: true, completion: nil)
Cela montrera le contrôleur de vue modale avec la barre de navigation. Les connaissances sur l’objectif C étant limitées, je n’ai pas écrit la partie présentation. Vous devriez être capable de comprendre cela. ;)
J'espère que cela t'aides!
Dans iOS 8, il existe une meilleure méthode. Vous pouvez utiliser des styles de présentation adaptatifs:
Objectif c:
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
return UIModalPresentationFullScreen;
}
- (UIViewController *)presentationController:(UIPresentationController *)controller viewControllerForAdaptivePresentationStyle:(UIModalPresentationStyle)style {
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController: controller.presentedViewController];
return navController;
}
Rapide:
UIPopoverPresentationControllerDelegate
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
return UIModalPresentationStyle.FullScreen
}
func presentationController(controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
var navController = UINavigationController(rootViewController: controller.presentedViewController)
return navController
}
Swift 4:
extension MyViewController: UIPopoverPresentationControllerDelegate {
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
return UIModalPresentationStyle.fullScreen
}
func presentationController(_ controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
return UINavigationController(rootViewController: controller.presentedViewController)
}
}
Dans la méthode prepare for segue, définissez le délégué:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if let adpostVC = segue.destinationViewController as? XXXController {
let popPC = adpostVC.popoverPresentationController
popPC?.delegate = self
Version rapide:
Suivez les étapes:
Remplacez prepareForSegue ()
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "goToYourController" {
let navigation: UINavigationController = segue.destinationViewController as! UINavigationController
var vc = YourViewController.init()
vc = navigation.viewControllers[0] as! YourViewController
//if you need send something to destnation View Controller
//vc.delegate = self
}
}
Il y a un moyen plus facile de faire cela. Comme dans les commentaires précédents (sans expliquer toutes les étapes), vous devez incorporer le contrôleur de vue de votre choix dans un contrôleur de navigation, puis définir votre contrôleur de vue de destination comme contrôleur de navigation, puis le contrôleur de navigation appelle le contrôleur de vue de destination.
Tout d’abord, intégrez le VC dans un NavVC. Ensuite, vous devez écrire le code pour définir la destination de la division sur Nav VC.
Le code ressemble à ceci:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
UINavigationController *nav = segue.destinationViewController;
AddTriviaVC *triv = [[AddTriviaVC alloc]init];
triv = nav.viewControllers[0];
triv.location = self.location;
}
J'espère que cela a du sens.
C'est probablement parce que vous n'avez pas de UINavigationController
dans votre modal. Vous devez en utiliser un (ou simplement ajouter une barre de navigation à votre ViewController dans le Storyboard) et le présenter de manière modale.
dans le storyboard, vous devez ajouter un élément de navigation à votre nouveau viewController, puis ajouter un élément de bouton barre pour votre bouton Terminé
Vous pouvez ajouter une barre d’outils par programme en procédant comme suit dans -(void)viewDidLoad
NSInteger tbHeight = 50;
tb = [[UIToolbar alloc] initWithFrame:CGRectMake(0, (self.view.frame.size.height - tbHeight), self.view.frame.size.width, tbHeight)];
tb.translucent = YES;
emailButton = [[UIBarButtonItem alloc] initWithTitle:@"Email Results" style:UIBarButtonItemStyleBordered target:tvController action:@selector(actionSheet:)];
UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleBordered target:self action:@selector(doneButtonPressed:)];
NSArray *barButton = [[NSArray alloc] initWithObjects:emailButton,flexibleSpace,doneButton,nil];
[tb setItems:barButton];
[self.view addSubview:tb];
barButton = nil;
Vous devrez ensuite créer un IBAction pour appuyer sur le bouton done et cela se fait comme suit:
-(IBAction)doneButtonPressed:(id)sender {
[self dismissModalViewControllerAnimated:YES];
}
Cela devrait vous donner ce que vous voulez avec votre contrôleur de vue modale.
Voici ma version COURTE de "Volodymyr Nazarkevych" dans Swift 4.2
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
switch(segue.identifier ?? "") {
case "segueIdentifier": // name of your segue
let navigation: UINavigationController = segue.destination as! UINavigationController
//here you create new name of your destination ViewController and assign his name to let constant above
guard let myNewViewController = navigation.viewControllers[0] as? DestinationViewController
//DestinationViewController is your 2-ViewController where you go to from first one.
else {
fatalError("Unexpected destination: \(segue.destination)")
}
// TO DO SOMETHING HERE
default:
fatalError("Unexpected Segue Identifier; \(String(describing: segue.identifier))")
}
}
Le code de "Volodymyr Nazarkevych" fonctionne parfaitement, mais uniquement lorsque vous passez de 1-ViewController à NavigationController de 2-ViewController, et non directement à 2-ViewController. MERCI BEAUCOUP VOVA!.
Également dans les cas de commutation après le code de blocage de destination, vous pouvez effectuer différentes tâches, par exemple pour obtenir des informations ou un fichier à partir du second ViewController.