ios - modally - swift present modal view controller programmatically
presentViewController y mostrando la barra de navegaciĆ³n (12)
Swift 3.0 / 4.0
Navegación:
guard let myVC = self.storyboard?.instantiateViewController(withIdentifier: "MyViewController") else { return }
let navController = UINavigationController(rootViewController: myVC)
self.navigationController?.present(navController, animated: true, completion: nil)
Volver:
self.dismiss(animated: true, completion: nil)
Swift 2.0
Navegación:
let myVC = self.storyboard?.instantiateViewControllerWithIdentifier("MyViewController");
let navController = UINavigationController(rootViewController: myVC!)
self.navigationController?.presentViewController(navController, animated: true, completion: nil)
Volver:
self.dismissViewControllerAnimated(true, completion: nil)
Tengo una jerarquía de controlador de vista y el controlador más alto se muestra como un modal y me gustaría saber cómo mostrar la barra de navegación cuando uso
''UIViewController:presentViewController:viewControllerToPresent:animated:completion''
Los documentos para la nota ''presentViewController: animated: completion:'':
''En iPhone y iPod touch, la vista presentada siempre es a pantalla completa. En iPad, la presentación depende del valor en la propiedad modalPresentationStyle ''.
Para ''modalPresentationStyle'', los documentos dicen:
El estilo de presentación determina cómo se muestra en pantalla un controlador de vista presentado de forma modal. En iPhone y iPod touch, los controles de vista modal siempre se presentan a pantalla completa, pero en el iPad hay varias opciones de presentación diferentes.
¿Hay alguna forma de garantizar que la barra de navegación sea visible debajo de la barra de estado una vez que se muestre el control de vista? ¿Debo interpretar el documento como, no tienes opciones de iPhone / iPod y solo en el iPad?
Anteriormente, estaba usando ''UIViewController:presentModalViewController:animated''
que funcionaba bien, pero desde iOS 5.0, la API ha quedado en desuso, así que estoy cambiando a la nueva.
Visualmente, lo que quiero hacer es tener el nuevo controlador deslizado desde la parte inferior de la pantalla, al igual que lo hacía la antigua API.
[actualización con código]:
// 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];
All a [self.navigationController pushViewController:controller animated:YES];
does es animar una transición, y agregarla a la pila del controlador de navegación, y algunas otras cosas increíbles de la barra de navegación. Si no te importa la animación de barra, entonces este código debería funcionar. ¡La barra aparece en el nuevo controlador y obtienes un gesto pop interactivo!
//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.
Editar: Lo sentimos, el control de vista actual llenará la pantalla completa. Tendrá que hacer una transición personalizada, con CGAffineTransform.translation o algo así, animar el controlador con la transición y luego agregarlo a viewControllers de navigationController.
Es cierto que si presenta un controlador de vista modalmente en el iPhone, siempre se presentará a pantalla completa, sin importar cómo lo presente en el controlador de vista superior de un controlador de navegación o de cualquier otro modo. Pero siempre puedes mostrar la barra de navegación de esta manera:
En lugar de presentar ese controlador de vista, presente modalmente un controlador de navegación modalmente con su controlador de vista raíz configurado como el controlador de vista que desea:
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:^{
}];
Debería ver una barra de navegación cuando su vista se presente de forma modal.
Puedes usar:
[self.navigationController pushViewController:controller animated:YES];
Volviendo (creo):
[self.navigationController popToRootViewControllerAnimated:YES];
Si no configuró la propiedad modalPresentationStyle (como UIModalPresentationFormSheet), la barra de navegación se mostrará siempre. Para asegurarse, siempre haga
[[self.navigationController topViewController] presentViewController:vieController
animated:YES
completion:nil];
Esto mostrará la barra de navegación siempre.
Swift 3
let vc0 : ViewController1 = ViewController1()
let vc2: NavigationController1 = NavigationController1(rootViewController: vc0)
self.present(vc2, animated: true, completion: nil)
Tuve el mismo problema en ios7. Lo llamé en selector y funcionó tanto en iOS7 como en iOS8.
[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: ^ {
}];
}
Una solución
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];
Versión Swift: presenta un ViewController que está integrado en un Controlador de navegación.
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)
}
Yo uso este código Está funcionando bien en iOS 8.
MyProfileEditViewController *myprofileEdit=[self.storyboard instantiateViewControllerWithIdentifier:@"myprofileeditSid"];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:myprofileEdit];
[self presentViewController:navigationController animated:YES completion:^{}];
prueba esto
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)
Si usa NavigationController en Swift 2.x
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let targetViewController = storyboard.instantiateViewControllerWithIdentifier("targetViewControllerID") as? TargetViewController
self.navigationController?.pushViewController(targetViewController!, animated: true)