ios - presentviewcontroller swift 4
Presente y descarte el controlador de vista modal (6)
¿Alguien puede darme el código de ejemplo que puedo usar para presentar primero un controlador de vista modal y luego descartarlo? Esto es lo que he estado intentando:
NSLog(@"%@", blue.modalViewController);
[blue presentModalViewController:red animated:YES];
NSLog(@"%@", blue.modalViewController);
[blue dismissModalViewControllerAnimated:YES];
NSLog(@"%@", blue.modalViewController);
Este código está en viewDidLoad ("azul" y "rojo" son ambas subclases de UIViewController). Espero que muestre la vista roja y luego la oculte inmediatamente, con algo de animación. Sin embargo, este fragmento de código solo presenta la vista modal y no la descarta. ¿Alguna idea? El primer registro muestra "nulo", mientras que los otros dos registros muestran <RedViewController: 0x3d21bf0>
Otro punto es, si pongo este código en applicationDidFinishLaunching: la vista roja no aparece en absoluto, y todos los registros obtienen "nulo"
Rápido
Actualizado para Swift 3
Storyboard
Crea dos Controladores de Vista con un botón en cada uno. Para el segundo controlador de vista, establezca el nombre de clase en SecondViewController
y el ID del guión gráfico en secondVC
.
Código
ViewController.swift
import UIKit
class ViewController: UIViewController {
@IBAction func presentButtonTapped(_ sender: UIButton) {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let myModalViewController = storyboard.instantiateViewController(withIdentifier: "secondVC")
myModalViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen
myModalViewController.modalTransitionStyle = UIModalTransitionStyle.coverVertical
self.present(myModalViewController, animated: true, completion: nil)
}
}
SecondViewController.swift
import UIKit
class SecondViewController: UIViewController {
@IBAction func dismissButtonTapped(_ sender: UIButton) {
self.dismiss(animated: true, completion: nil)
}
}
Fuente:
- Documentation
- Pues contesta
En primer lugar, cuando pones ese código en applicationDidFinishLaunching, es posible que los controladores instalados desde Interface Builder aún no estén vinculados a tu aplicación (por lo que "rojo" y "azul" siguen siendo nil
).
Pero para responder a su pregunta inicial, lo que está haciendo mal es que está llamando a dismissModalViewControllerAnimated:
en el controlador equivocado! Debería ser así:
[blue presentModalViewController:red animated:YES];
[red dismissModalViewControllerAnimated:YES];
Por lo general, el controlador "rojo" debe decidir retirarse en algún momento (tal vez cuando se hace clic en el botón "cancelar"). Entonces el controlador "rojo" podría llamar al método en self
:
[self dismissModalViewControllerAnimated:YES];
Si todavía no funciona, podría tener algo que ver con el hecho de que el controlador se presenta en forma de animación, por lo que es posible que no se le permita descartar el controlador tan pronto después de presentarlo.
La forma más fácil de hacerlo es usando Storyboard y un Segue.
Simplemente cree un Segue desde el FirstViewController (no el controlador de navegación) de su TabBarController a un LoginViewController con la interfaz de usuario de inicio de sesión y asígnele el nombre "showLogin".
Cree un método que devuelva un BOOL para validar si el usuario inició sesión y / o su sesión es válida ... preferiblemente en AppDelegate. Llámalo isSessionValid.
En su FirstViewController.m anule el método viewDidAppear de la siguiente manera:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
if([self isSessionValid]==NO){
[self performSegueWithIdentifier:@"showLogin" sender:self];
}
}
Luego, si el usuario inició sesión exitosamente, simplemente descarte o muestre el LoginViewController para mostrar sus pestañas.
Funciona al 100%!
¡Espero eso ayude!
La manera más fácil de cansarme en xcode 4.52 era crear una vista adicional y conectarlos usando el modo modal (presione arrastrar el botón desde la vista uno a la segunda vista, elija Modal). Luego arrastre un botón hacia la segunda vista o la vista modal que creó. Controle y arrastre este botón al archivo de encabezado y use la conexión de acción. Esto creará un IBaction en su archivo controller.m. Encuentra tu tipo de acción de botón en el código.
[self dismissViewControllerAnimated:YES completion:nil];
Rápido
self.dismissViewControllerAnimated(true, completion: nil)
presentModalViewController:
MainViewController *mainViewController=[[MainViewController alloc]init];
[self.navigationController presentModalViewController:mainViewController animated:YES];
dismissModalViewController:
[self dismissModalViewControllerAnimated:YES];