ios - Segue modal, la barra de navegación desaparece.
objective-c xcode4.6 (9)
Estoy usando Xcode 4.6.1 para codificar en Objective-C. Quiero saber cómo puedo mantener la barra de navegación que se muestra cuando creo un segmento modal entre 2 controladores de Vista, porque estoy haciendo el segmento en el guión gráfico y cuando ejecuto la aplicación la barra de navegación del segundo controlador de vista desaparece, Tengo un botón hecho en esa barra pero no puedo verlo.
En iOS 8 hay un método mejor. Puede utilizar estilos de presentación adaptativos:
- Utilice un "Presentar como popover" segue
- Configure su controlador para adoptar el protocolo UIPopoverPresentationControllerDelegate
- Implementar 2 métodos.
C objetivo:
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
return UIModalPresentationFullScreen;
}
- (UIViewController *)presentationController:(UIPresentationController *)controller viewControllerForAdaptivePresentationStyle:(UIModalPresentationStyle)style {
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController: controller.presentedViewController];
return navController;
}
Rápido:
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)
}
}
En preparación para el método segue establecer el delegado:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if let adpostVC = segue.destinationViewController as? XXXController {
let popPC = adpostVC.popoverPresentationController
popPC?.delegate = self
Hay una manera más fácil de hacer esto. Como se dijo en los comentarios anteriores (pero no se explicaron todos los pasos), debe integrar el controlador de vista de destino deseado en un controlador de navegación, luego configurar el controlador de vista de destino para que sea el Controlador de navegación, luego el controlador de navegación llama al controlador de vista de destino.
Primero, incrustar el VC en un NavVC. Luego debe escribir el código para establecer que el destino de segue sea el VC de navegación.
El código se ve así:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
UINavigationController *nav = segue.destinationViewController;
AddTriviaVC *triv = [[AddTriviaVC alloc]init];
triv = nav.viewControllers[0];
triv.location = self.location;
}
Espero que esto tenga sentido.
Los segmentos modales ocupan toda la pantalla, por lo que todas las barras de navegación, barras de herramientas o barras de pestañas que se encuentran en el controlador de presentación se cubrirán. Si desea una barra de navegación en este controlador modal, deberá agregar una específicamente a este y agregar los botones que desee a esa nueva barra de navegación (o barra de herramientas). Si no quieres hacer esto, entonces no lo presentes modalmente, presiona.
Probablemente sea así porque no tienes un UINavigationController
en tu modal. Debería usar uno (o simplemente agregar una barra de navegación a su ViewController en el Guión gráfico), y presentar eso modalmente.
Puede agregar una barra de herramientas programáticamente haciendo lo siguiente en -(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;
Luego, tendrá que crear una acción IBA para presionar el botón "Hecho" y se hará así:
-(IBAction)doneButtonPressed:(id)sender {
[self dismissModalViewControllerAnimated:YES];
}
Eso debería darle lo que quiere con su controlador de vista modal.
Simplemente puedes hacer lo siguiente para mostrar la barra de navegación:
C objetivo
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)
Esto mostrará el controlador de vista modal con la barra de navegación. El conocimiento sobre Objective-C es limitado, por lo que no escribí la parte de la presentación. Usted debería ser capaz de resolver eso. ;)
¡Espero que esto ayude!
en el guión gráfico, debe agregar un elemento de navegación a su nuevo viewController y, a continuación, agregar el elemento del botón de barra para el botón realizado
versión rápida:
Siga los pasos:
- Incrustar VC en NavigationController
Anular 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 } }
Solo agrega otro Navigation Controller
a tu controlador de vista modal. Sigue los pasos
- Seleccione el
Modal View Controller
- Ir al
Editor menu
- Seleccionar
Embed In
- Seleccione el
Navigation Controller
Ejecutar la aplicación. Ahora debería funcionar perfectamente.
Espero que esto resuelva tu problema.