86 votes

iPhone: Afficher le contrôleur UITableView modal avec la barre de navigation

Je montre une vue modale qui est une classe UITableViewController . Pour une raison quelconque, la barre de navigation ne sera pas affichée lorsque je la montrerai. Voici mon code:

 SettingsCreateAccount *detailViewController = [[SettingsCreateAccount alloc] initWithStyle:UITableViewStyleGrouped];
    detailViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    detailViewController.navigationController.navigationBarHidden = NO;
    [self.navigationController presentModalViewController:detailViewController animated:YES];
    detailViewController = nil;
    [detailViewController release];
 

Je pensais que c'était affiché par défaut? Si cela peut aider, j’appelle cela depuis une autre classe qui est aussi un UITableViewController géré par un UINavigationController . Des idées?

144voto

BoltClock Points 249668

Lorsque vous présentez un modal-vue-contrôleur ne pas utiliser n'importe quel manettes de navigation ou les barres de navigation. Si vous désirez vous afficher une barre de navigation, vous devez ajouter la barre de navigation en tant que sous-vue de votre modal de la vue et de le présenter comme vous le faites.

Si vous souhaitez présenter un modal-vue-contrôleur avec des fonctions de navigation, vous devez présenter un modal manette de navigation contenant votre vue de détail contrôleur au lieu de cela, comme ceci:

SettingsCreateAccount *detailViewController = [[SettingsCreateAccount alloc] initWithStyle:UITableViewStyleGrouped];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:detailViewController];
[detailViewController release];

navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:navController animated:YES];
[navController release];

Votre modal contrôleur de gérer sa propre pile de navigation.

36voto

Scott Points 75

Voici une manière d'afficher la barre de navigation pour ceux qui sont à l'aide de story-boards, proposé par Apple Tutoriel sur le Storyboard.

Parce qu'un modal-vue-contrôleur n'est pas ajouté à la pile de navigation, il ne peut pas faire une barre de navigation à partir de l'affichage de la table du contrôleur de manette de navigation. Pour donner le point de vue du contrôleur une barre de navigation lorsqu'il est présenté sous forme modale, l'incorporer dans sa propre manette de navigation.

  1. Dans le mode plan, sélectionnez Vue-Contrôleur.
  2. Avec la vue du contrôleur sélectionné, choisissez l'Éditeur de > Incorporer Dans > manette de Navigation.

17voto

malcolmhall Points 1909

Sur iOS 7, vous souhaitez simplement qu'une barre de navigation sur votre contrôleur de vue modale affiche un titre et des boutons? Essayez cette magie dans votre UITableViewController:

 // in the .h
@property (strong) UINavigationBar* navigationBar;

//in the .m
- (void)viewDidLoad {
    [super viewDidLoad];

    self.navigationItem.title = @"Awesome";
    self.navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectZero];
    [self.view addSubview:_navigationBar];
    [self.navigationBar pushNavigationItem:self.navigationItem animated:NO];
}

-(void)layoutNavigationBar{
    self.navigationBar.frame = CGRectMake(0, self.tableView.contentOffset.y, self.tableView.frame.size.width, self.topLayoutGuide.length + 44);
    self.tableView.contentInset = UIEdgeInsetsMake(self.navigationBar.frame.size.height, 0, 0, 0);
}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    //no need to call super
    [self layoutNavigationBar];
}

-(void)viewDidLayoutSubviews{
    [super viewDidLayoutSubviews];
    [self layoutNavigationBar];
}
 

7voto

Stanislaw Points 670

Je veux partager ce que la solution retenue peut être utilisé dans des projets avec les storyboards:

L'approche la plus simple est de mettre dans un storyboard vide manette de navigation avant le VC qui doit être présenté sous forme modale, de sorte que les relations de ressembler à:

(Présentateur VC) -> présente modal -> (manette de navigation ayant un contrôleur à être présenté comme sa racine).

Nous avons essayé cette approche pour un certain temps et a remarqué que notre storyboards devenir "pollué" par un grand nombre de ces intermédiaires manettes de navigation lors de chaque! d'entre eux est utilisé exclusivement pour un! présentation d'un autre contrôleur, que nous voulons être présenté sous forme modale avec la barre de navigation.

Notre solution actuelle est d'encapsuler le code de la accepté de répondre à une coutume segue:

#import "ModalPresentationWithNavigationBarSegue.h"

@implementation ModalPresentationWithNavigationBarSegue

- (void)perform {
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:self.destinationViewController];

    [self.sourceViewController presentViewController:navigationController animated:YES completion:nil];
}
@end

Avoir cette segue dans notre projet, nous ne créent pas d'intermédiaire manettes de navigation dans nos storyboards de plus, nous avons il suffit d'utiliser cette ModalPresentationWithNavigationBarsegue comme:

Présentateur VC --> Presentee VC

J'espère que cette réponse vous sera utile pour les gens qui aiment à éviter les doubles emplois inutiles dans leurs applications des story-boards.

5voto

xhan Points 2876

Si vous avez seulement besoin de NavigationBar , vous pouvez ajouter une instance de UINavigationBar et lui attribuer des éléments BarItems.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X