web-dev-qa-db-fra.com

Segment modal, la barre de navigation disparaît

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.

46
Johnny Dahdah

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.

57
rdelmar

Ajoutez simplement un autre Navigation Controller à votre contrôleur de vue modale. Suis les étapes

  1. Sélectionnez le Modal View Controller 
  2. Aller au Editor menu
  3. Sélectionnez Embed In
  4. Sélectionnez Navigation Controller

Lancer l'application. Maintenant cela devrait fonctionner parfaitement. 

J'espère que ceci résoudra votre problème.

81
Saleh Masum

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!

12
Christopher Smit

Dans iOS 8, il existe une meilleure méthode. Vous pouvez utiliser des styles de présentation adaptatifs:

  1. Utilisez une séquence "Present as popover"
  2. Configurez votre contrôleur pour qu'il adopte le protocole UIPopoverPresentationControllerDelegate. 
  3. Implémenter 2 méthodes

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
10
user1760527

Version rapide:

Suivez les étapes: 

  1. Incorporer VC dans NavigationController
  2. 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
      }
    }
    
5

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.

4
jungledev

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.

1
Levi

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é

1
LE24

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.

1
Stan Cromlish

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.

0
Alex D.