Estoy mostrando una vista modal que es una UITableViewController
clase. Por alguna razón, no mostrará la barra de navegación cuando la muestre. Aquí está mi código:
SettingsCreateAccount *detailViewController = [[SettingsCreateAccount alloc] initWithStyle:UITableViewStyleGrouped];
detailViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
detailViewController.navigationController.navigationBarHidden = NO;
[self.navigationController presentModalViewController:detailViewController animated:YES];
detailViewController = nil;
[detailViewController release];
Pensé que se mostraba por defecto. Si ayuda, lo estoy llamando desde otra clase que también es UITableViewController
administrada por un UINavigationController
. Ideas?
fuente
Aquí hay una forma de mostrar la barra de navegación para aquellos que usan guiones gráficos, sugerida por el Tutorial de Apple en Storyboard .
Debido a que un controlador de vista modal no se agrega a la pila de navegación, no obtiene una barra de navegación del controlador de navegación del controlador de vista de tabla. Para darle al controlador de vista una barra de navegación cuando se presenta de forma modal, incruste en su propio controlador de navegación.
fuente
¿En iOS 7 y solo desea una barra de navegación en su controlador de vista modal para mostrar un título y algunos botones? Prueba esta magia en tu 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]; }
fuente
[self.view bringSubviewToFront:self.navigationBar];
al final de-(void)layoutNavigationBar
.Quiero compartir cómo se puede utilizar la solución aceptada en proyectos con guiones gráficos:
El enfoque simple es colocar un controlador de navegación en blanco del guión gráfico antes del VC que se presentará modalmente, para que las relaciones se vean como:
Hemos probado este enfoque por un tiempo y notamos que nuestros guiones gráficos se "contaminan" por una gran cantidad de estos controladores de navegación intermedios cuando cada uno! de ellos se utiliza exclusivamente para uno! presentación de algún otro controlador, que queremos que se presente modalmente con barra de navegación.
Nuestra solución actual es encapsular el código de la respuesta aceptada a un segue personalizado:
#import "ModalPresentationWithNavigationBarSegue.h" @implementation ModalPresentationWithNavigationBarSegue - (void)perform { UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:self.destinationViewController]; [self.sourceViewController presentViewController:navigationController animated:YES completion:nil]; } @end
Teniendo esta segue en nuestro proyecto, ya no creamos controladores de navegación intermedios en nuestros guiones gráficos, solo usamos este ModalPresentationWithNavigationBarSegue como:
Espero que esta respuesta sea útil para las personas a las que les gusta evitar la duplicación innecesaria en los guiones gráficos de sus aplicaciones.
fuente
Si solo necesita un
NavigationBar
, puede agregar una instanciaUINavigationBar
y asignarle BarItems.fuente
Solo quería agregar algo a lo que dijo @Scott. Su respuesta es definitivamente la forma más fácil y aceptada de hacerlo ahora con Storyboards, iOS 7 y 8 ... (y pronto, 9).
Definitivamente, agregar un controlador de vista al Storyboard e incrustarlo como lo describe @Scott es el camino correcto.
Luego, simplemente agregue el segue arrastrando el control desde el controlador de la vista de origen al destino (el que desea mostrar modalmente), seleccione "Presentar modalmente" cuando aparezca la pequeña vista con las opciones para el tipo de segue. Probablemente sea bueno darle un nombre también (en el siguiente ejemplo utilizo "presentMyModalViewController").
Una cosa que necesitaba que faltaba es el caso de @ Scott es cuando realmente desea pasar algunos datos a ese controlador de vista presentado modalmente que está incrustado en el controlador de navegación.
Si toma el segue.destinationViewController, será un UINavigationController, no el controlador que incrustó en UINavigationController.
Entonces, para acceder al controlador de vista integrado dentro del controlador de navegación, esto es lo que hice:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"presentMyModalViewController"]) { // This could be collapsed, but it's a little easier to see // what's going on written out this way. // First get the destination view controller, which will be a UINavigationController UINavigationController *nvc = (UINavigationController *)segue.destinationViewController; // To get the view controller we're interested in, grab the navigation controller's "topViewController" property MyModalViewController *vc = (EmailReceiptViewController *)[nvc topViewController]; // Now that we have the reference to our view controller, we can set its properties here: vc.myAwesomeProperty = @"awesome!"; } }
¡Espero que esto ayude!
fuente