web-dev-qa-db-fra.com

presentViewController et affichage de la barre de navigation

J'ai une hiérarchie de contrôleur de vue et le contrôleur le plus haut est affiché en tant que modal et je voudrais savoir comment afficher la barre de navigation lors de l'utilisation

'UIViewController:presentViewController:viewControllerToPresent:animated:completion'

La documentation pour 'presentViewController: animé: complétion:' note:

'Sur iPhone et iPod touch, la vue présentée est toujours en plein écran. Sur iPad, la présentation dépend de la valeur de la propriété modalPresentationStyle. '

Pour 'modalPresentationStyle', la documentation dit:

Le style de présentation détermine la manière dont un contrôleur de vue présenté de façon modale est affiché à l'écran. Sur iPhone et iPod touch, les contrôleurs de vue modale sont toujours présentés en plein écran, mais sur iPad, il existe plusieurs options de présentation.

Existe-t-il un moyen de s’assurer que la barre de navigation est visible sous la barre d’état une fois que le contrôle de vue s’affiche? Dois-je interpréter le document comme étant, vous ne disposez d'aucune option pour iPhone/iPod et uniquement pour iPad?

Auparavant, j'utilisais 'UIViewController:presentModalViewController:animated' qui a bien fonctionné, mais depuis iOS 5.0, l’API est obsolète, je passe donc à la nouvelle.

Visuellement, ce que je cherche à faire est de faire glisser le nouveau contrôleur à partir du bas de l'écran, tout comme l'ancien API.

[mise à jour avec le code]:

// My root level view:
UIViewController *vc = [[RootViewController alloc] 
                            initWithNibName:nil 
                            bundle:[NSBundle mainBundle]];
navController = [[UINavigationController alloc] initWithRootViewController:vc];        
....

// Within the RootViewController, Second view controller is created and added 
// to the hierarchy. It is this view controller that is responsible for 
// displaying the DetailView:
SecondTierViewController *t2controller = [[SecondTierViewController alloc] 
                                           initWithNibName:nil
                                           bundle:[NSBundle mainBundle]];

[self.navigationController pushViewController:t2controller animated:YES];

// Created by SecondTierViewController 
DetailViewController *controller = [[DetailViewController alloc] initWithNibName:nil                                                                                 
                                        bundle:[NSBundle mainBundle]];  

controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
controller.modalPresentationStyle = UIModalPresentationCurrentContext;

[self.navigationController presentViewController:controller 
                                        animated:YES 
                                        completion:nil];
84
Jonas Gardner

Il est vrai que si vous présentez un contrôleur de vue de manière modale sur l'iPhone, il sera toujours présenté en plein écran, quelle que soit la manière dont vous le présentez sur le contrôleur de vue supérieure d'un contrôleur de navigation ou de tout autre manière. Mais vous pouvez toujours afficher la barre de navigation avec la solution de contournement suivante:

Plutôt que de présenter ce contrôleur de vue de manière modale, présentez un contrôleur de navigation de manière modale avec son contrôleur de vue racine défini en tant que contrôleur de vue souhaité:

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:nil bundle:nil];
UINavigationController *navigationController = 
    [[UINavigationController alloc] initWithRootViewController:myViewController];

//now present this navigation controller modally 
[self presentViewController:navigationController
                   animated:YES
                   completion:^{

                        }];

Vous devriez voir une barre de navigation lorsque votre vue est présentée sous forme modale.

184
Manish Ahuja

Swift 5.*

Navigation:

guard let myVC = self.storyboard?.instantiateViewController(withIdentifier: "MyViewController") else { return }
let navController = UINavigationController(rootViewController: myVC)

self.navigationController?.present(navController, animated: true, completion: nil)

retour:

self.dismiss(animated: true, completion: nil)

Swift 2.

Navigation:

let myVC = self.storyboard?.instantiateViewControllerWithIdentifier("MyViewController");
let navController = UINavigationController(rootViewController: myVC!)

self.navigationController?.presentViewController(navController, animated: true, completion: nil)

retour:

self.dismissViewControllerAnimated(true, completion: nil)
36
Tal Zion

Peux tu utiliser:

[self.navigationController pushViewController:controller animated:YES];

En revenant (je pense):

[self.navigationController popToRootViewControllerAnimated:YES];
23
marrop

J'ai eu le même problème sur iOS 7. Je l'ai appelé dans le sélecteur et cela a fonctionné à la fois sur iOS 7 et iOS 8.

[self performSelector: @selector(showMainView) withObject: nil afterDelay: 0.0];

- (void) showMainView {
    HomeViewController * homeview = [
        [HomeViewController alloc] initWithNibName: @
        "HomeViewController"
        bundle: nil];
    UINavigationController * navcont = [
        [UINavigationController alloc] initWithRootViewController: homeview];
    navcont.navigationBar.tintColor = [UIColor whiteColor];
    navcont.navigationBar.barTintColor = App_Theme_Color;
    [navcont.navigationBar
    setTitleTextAttributes: @ {
        NSForegroundColorAttributeName: [UIColor whiteColor]
    }];
    navcont.modalPresentationStyle = UIModalPresentationFullScreen;
    navcont.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self.navigationController presentViewController: navcont animated: YES completion: ^ {

    }];
}
2
Mohammad Parvez

Swift 3

        let vc0 : ViewController1 = ViewController1()
        let vc2: NavigationController1 = NavigationController1(rootViewController: vc0)
        self.present(vc2, animated: true, completion: nil)
1
BennyTheNerd

Tout un [self.navigationController pushViewController:controller animated:YES]; do anime une transition et l'ajoute à la pile de contrôleurs de navigation et à d'autres éléments d'animation de la barre de navigation. Si vous ne vous souciez pas de l'animation de la barre, alors ce code devrait fonctionne. La barre apparaît sur le nouveau contrôleur et vous obtenez un geste pop interactif!

//Make Controller
DetailViewController *controller = [[DetailViewController alloc] initWithNibName:nil                                                                                 
                                    bundle:[NSBundle mainBundle]];  
//Customize presentation
controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
controller.modalPresentationStyle = UIModalPresentationCurrentContext;

//Present controller
[self presentViewController:controller 
                   animated:YES 
                 completion:nil];
//Add to navigation Controller
[self navigationController].viewControllers = [[self navigationController].viewControllers arrayByAddingObject:controller];
//You can't just [[self navigationController].viewControllers addObject:controller] because viewControllers are for some reason not a mutable array.

Edit: Désolé, presentViewController remplira tout l'écran. Vous devrez créer une transition personnalisée, avec CGAffineTransform.translation ou quelque chose du genre, animer le contrôleur avec la transition, puis l'ajouter au viewControllers de navigationController.

1
Ignat

J'utilise ce code. Cela fonctionne bien dans iOS 8.

MyProfileEditViewController *myprofileEdit=[self.storyboard instantiateViewControllerWithIdentifier:@"myprofileeditSid"];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:myprofileEdit];
[self presentViewController:navigationController animated:YES completion:^{}];
0
Anil Prasad

Version Swift: présente un ViewController intégré dans un contrôleur de navigation.

    override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    //  Identify the bundle by means of a class in that bundle.
    let storyboard = UIStoryboard(name: "Storyboard", bundle: NSBundle(forClass: SettingsViewController.self))

    // Instance of ViewController that is in the storyboard.
    let settingViewController = storyboard.instantiateViewControllerWithIdentifier("SettingsVC")

    let navController = UINavigationController(rootViewController: settingViewController)

    presentViewController(navController, animated: true, completion: nil)

}
0
ioopl

Si vous utilisez NavigationController dans Swift 2.x

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let targetViewController = storyboard.instantiateViewControllerWithIdentifier("targetViewControllerID") as? TargetViewController
self.navigationController?.pushViewController(targetViewController!, animated: true)
0
Ego Slayer

essaye ça

     let transition: CATransition = CATransition()
    let timeFunc : CAMediaTimingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
    transition.duration = 1
    transition.timingFunction = timeFunc
    transition.type = kCATransitionPush
    transition.subtype = kCATransitionFromRight
    self.view.window!.layer.addAnimation(transition, forKey: kCATransition)
    self.presentViewController(vc, animated:true, completion:nil)
0
tsinghan

Si vous n'avez pas défini la propriété modalPresentationStyle (comme pour UIModalPresentationFormSheet), la barre de navigation sera toujours affichée. Pour assurer, toujours faire

[[self.navigationController topViewController] presentViewController:vieController 
                                                            animated:YES 
                                                          completion:nil];

Cela affichera toujours la barre de navigation.

0
rakeshNS

Une solution

DetailViewController *controller = [[DetailViewController alloc] initWithNibName:nil                                                                                 
                                        bundle:[NSBundle mainBundle]];  

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
navController.modalPresentationStyle = UIModalPresentationCurrentContext;



[self.navigationController presentViewController:navController 
                                        animated:YES 
                                        completion:nil];
0
Yatin Sarbalia