ios - Realice Segue en ViewDidLoad
ios5 uistoryboard (11)
Así es como lo hice en SWIFT. Esto también oculta el Controlador de Vista.
override func viewWillAppear(animated: Bool) {
let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
let isloggedIn = prefs.objectForKey("isLoggedIn") as? Bool
if (isloggedIn != false) {
self.view.hidden = true
} else {
self.view.hidden = false
}
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(true)
let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
let isloggedIn = prefs.objectForKey("isLoggedIn") as? Bool
if (isloggedIn != false) {
println("this should work")
self.performSegueWithIdentifier("Login", sender: self)
}
}
En iOS 5 tengo un Storyboard con un controlador de vista modal, que me gustaría mostrar si es la primera vez que el usuario está en la aplicación, después de eso me gustaría omitir este controlador de vista.
Configuré una clave NSDefault para manejar esto, pero cuando reviso para ver si esto está configurado y luego uso performSegueWithIdentifier para iniciar la transición, no pasa nada. Si pongo este segue detrás de un botón, funciona bien ...
Cargando en ViewDidLoad hizo que "under-layer" parpadeara. Lo resolví cargando mi Storyboard programáticamente. Por lo tanto, en Target / Main Storyboard, déjelo en blanco. Luego agrega lo siguiente:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Load Main App Screen
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
HomeScreenVC *homeScreenVC = [storyboard instantiateInitialViewController];
self.window.rootViewController = homeScreenVC;
[self.window makeKeyAndVisible];
// Load Login/Signup View Controller
UIViewController *mainLoginVC = [storyboard instantiateViewControllerWithIdentifier:@"MainLoginVC"];
[mainLoginVC setModalPresentationStyle:UIModalPresentationFullScreen];
[homeScreenVC presentModalViewController:mainLoginVC animated:NO];
return YES;
}
El problema es que está agregando una segunda vista a la jerarquía antes de que la primera se haya agregado completamente. Intenta poner tu código en:
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
// Present your modal from here
}
Después de que se llama a [super viewDidAppear]
, tiene una vista completamente cargada para modificar.
La mejor solución es hacer esto:
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[self performSegueWithIdentifier:@"NameSegue" sender:self];
}
No hay un problema principal con la realización de segues en viewDidLoad (después de la llamada a Super por supuesto).
El problema es realizar segues antes de que la ventana de la aplicación se haga visible. El UIViewController que desea mostrar es parte del guión gráfico principal, por lo que se carga en la memoria antes de que la aplicación comience a ejecutar su código en el delegado de la aplicación. En su caso, iOS llama a viewDidLoad antes de que su ventana de la aplicación recibiera el mensaje: MakeKeyAndVisible.
La parte importante es la visibilidad. ¡Realizar un segue en una jerarquía de vistas en la cual la ventana no está visible no hace nada!
Puedes intentar hacer algo como esto:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// The window initialized with hidden = YES, so in order to perform the segue we need to set this value to NO.
// After this action, the OS will add the window.rootViewController''s view as a subview of the window.
self.window.hidden = NO;
[self.window.rootViewController performSegueWithIdentifier:_IDENTIFIER_ sender:self.window.rootViewController];
// Now that the window is not hidden, we must make it key.
[self.window makeKeyWindow];
return YES;
}
Para Swift:
dispatch_async(dispatch_get_main_queue()) {
self.performSegueWithIdentifier("toView2", sender: self)
}
Para Swift 3:
DispatchQueue.main.async {
self.performSegueWithIdentifier("toView2", sender: self)
}
Respondí una pregunta similar donde el desarrollador quería mostrar una pantalla de inicio de sesión al inicio. Puse un código de muestra para él que se puede descargar here . La clave para resolver este problema es llamar a las cosas en el momento correcto si desea mostrar este nuevo controlador de vista, verá en el ejemplo que tiene que usar algo como esto
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self presentModalViewController:vc animated:YES];
}
También tengo una explicación de cómo funcionan los guiones y los guiones gráficos que puedes ver here
Yo tuve el mismo problema. Antes de encontrar esta pregunta, resolví este problema usando asincronización en el hilo principal. De esta forma, este código será llamado por el subproceso de la interfaz de usuario justo después de crear la vista.
dispatch_async(dispatch_get_main_queue(), ^{
[self performSegueWithIdentifier:@"segueAlbums" sender:self];
});
Este código puede viewDidLoad
en el método viewDidLoad
.
ACTUALIZACIÓN: esta solución ya no funciona en iOS 8.
Una forma correcta de resolver su problema es activar el controlador de vista modal segue / present en applicationDidBecomeActive:
método de delegado de la aplicación o en un controlador de notificación UIApplicationDidBecomeActiveNotification
.
La documentación de Apple realmente aconseja lo mismo :
Si su aplicación estaba anteriormente en segundo plano, también podría usarla para actualizar la interfaz de usuario de su aplicación.
Esta solución tiene la ventaja de que funciona con el mecanismo de carga del guión gráfico principal para que no tenga que cargar nada manualmente y escribir código innecesario.
Utilizo esta solución con éxito en iOS 6.1, 7.0 y 7.1 y también debería funcionar en iOS 5.
Actualizado para Swift 3
El siguiente fragmento de código le permite cargar el control de vista que desee. En mi caso, era un TabBarController si el usuario tenía un token de inicio de sesión de Facebook válido. El beneficio de esta solución sobre la otra solución Swift 3 es que es instantánea sin parpadeo de pantalla.
func applicationDidBecomeActive(_ application: UIApplication) {
if FBSDKAccessToken.current() != nil {
self.window?.rootViewController?.present((self.window?.rootViewController?.storyboard?.instantiateViewController(withIdentifier: "TabBarController"))!, animated: false, completion: nil)
}
}
Swift 3
override func viewWillAppear(_ animated: Bool) {
if authPreference.isExist() == true {
self.view.isHidden = true
} else {
self.view.isHidden = false
}
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(true)
if authPreference.isExist() == true {
navigateToSegue()
}
}