2012-05-10 15 views
5

Estoy trabajando en una aplicación que al inicio comprueba credenciales de inicio de sesión válidas, y si se encuentran y no expira, se muestra el controlador principal de vista dividida, y si no se muestra una pantalla de inicio de sesión.¿Se puede usarSegueWithIdentifier con AppDelegate?

Cada parte funciona bien por separado, pero estoy luchando con la mejor manera en el momento del lanzamiento para seleccionar la vista adecuada para mostrar.

He intentado fijar un segue modal desde el controlador de vista raíz, y en mi aplicación: didFinishLaunchingWithOptions: función en la App Delegado, llamando a esto:

// Segue to the login view controller... 
if (loginNeeded) { 
    [self.window.rootViewController performSegueWithIdentifier:@"LoginScreen" sender:self]; 
} 

Esto lógicamente debería funcionar, pero desencadenar segues de dentro de la aplicación, el delegado parece ser imposible.

¿Cuál es el lugar y la técnica ideal para manejar esto?

+0

¿Por qué vas a lanzar el delegado? ¿Por qué no hacerlo primero en 'ViewdidLoad' – Sirens

Respuesta

4

Puede probar un segue personalizado, según esta publicación hiding-a-segue-on-login-process.

Alternativamente, si usted está desesperado por tener la pantalla de inicio de sesión antes de la carga del controlador de vista dividida probar algo a lo largo de las siguientes líneas ...

Crear su pantalla de inicio de sesión en el guión gráfico principal, como, por ejemplo, una subclase de UIViewController . Asegúrese de que sea la escena inicial (marque Es Controlador de vista inicial).

En el guión gráfico, cree un nuevo segue desde su clase de inicio de sesión al controlador SplitView original. Déle un identificador, 'Load SplitViewController' y un nombre personalizado de clase segue al que llamaremos FullyReplaceSegue.

En el archivo .m clase de login, agregue código para llamar una vez que el usuario ha iniciado sesión:

[self performSegueWithIdentifier:@"Load SplitViewController" sender:self]; 

crear la nueva clase segue, basado en UIStoryboardSegue y el nombre que FullyReplaceSegue a lo anterior.

archivo .h

#import <UIKit/UIKit.h> 
@interface : UIStoryboardSegue 

@end 

archivo .m

#import "FullyReplaceSegue.h" 

@implementation FullyReplaceSegue 

- (void)perform 
{ 
    UIViewController *dest = (UIViewController *) super.destinationViewController; 
    UIWindow *window = [UIApplication sharedApplication].keyWindow; 
    window.rootViewController = dest; 

    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
     UISplitViewController *splitViewController = (UISplitViewController *)dest; // assumes we're transitioning to a UISplitViewController! 
     UINavigationController *navigationController = [splitViewController.viewControllers lastObject]; 
     splitViewController.delegate = (id)navigationController.topViewController; 
    } 
} 

@end 
+0

No terminé intentando esto, pero parece una solución extremadamente inteligente. – radven

1

¿Por qué no carga la pantalla que sería visible asumiendo las credenciales de inicio de sesión correctas y no expiradas (configurándola como el controlador de vista raíz de la ventana), y luego en viewDidLoad de ese primer controlador de vista, compruebe si se necesita una actualización de las credenciales de inicio de sesión. Si es así, pase al controlador de vista de inicio de sesión.

+0

Apple requiere que el controlador de vista dividida sea la raíz, por lo que realmente no hay un lugar para acceder a viewDidLoad a menos que yo subclase. Parece que debería haber una manera más simple. – radven

+0

Así que divida la raíz y compruebe viewDidLoad de uno de sus controladores de vista. La idea es la misma – jmstone617

+0

Lo he intentado ahora, y los cambios en viewDidLoad no funcionan. He hecho una pregunta diferente pero relacionada con algunos detalles más aquí: http://stackoverflow.com/questions/10541852/correctly-present-conditional-login-screen-at-app-startup-with-storyboards-and-s – radven

4

Así es como lo hice.

En didFinishLaunchingWithOptions:

//save the root view controller 
[[self window] makeKeyAndVisible]; 
UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController; 
rootController = [[navigationController viewControllers] objectAtIndex:0]; 

En algún otro lugar en el delegado de la aplicación:

[rootController performSegueWithIdentifier:@"fileSegueID" sender:self]; 

Luego, en el guión gráfico, crear una transición suave desde el punto de vista de que se le asigna como "rootController", a la la vista opcional deseada, y le da a esa nueva segue la identificación fileSegueID.Se necesita cierta depuración para garantizar que la variable rootController se asigne a la vista correcta.

+2

¡Gracias! '[[self window] makeKeyAndVisible];' es lo que me faltaba. –

2

Tal vez un poco tarde, pero estaba buscando las mismas sugerencias. Esto es lo que terminé haciendo.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Signup" bundle:nil]; 
    if(isLoggedIn) { 
    UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController; 
    IndexController *ivc = [storyboard instantiateViewControllerWithIdentifier:@"IndexController"]; 
    [navigationController pushViewController:ivc animated:NO]; 
} 
0

Sí, se puede utilizar, si obtiene una referencia al controlador de vista principal de segue. Se puede conseguir de esta manera:

UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController; 

[[[navigationController viewControllers] objectAtIndex:0] performSegueWithIdentifier:@"LoginScreen" sender:self]; 

Esto sólo funcionará si el índice de viewControllers matriz coincide con el de su controlador de vista y si es que existe, por supuesto. En este caso, es el primero (en el conjunto y el guión gráfico).

El segue ("LoginScreen") no se debe adjuntar a una acción. La forma de hacerlo es arrastrando el control desde el icono del propietario del archivo en la parte inferior de la escena del guión gráfico hasta la escena de destino. Aparecerá una ventana emergente que pedirá una opción en "Segue manual"; elige "Push" como tipo. Toca el pequeño cuadrado y asegúrate de estar en el Inspector de Atributos. Déle un identificador que usará para referirse a él en el código.

Cuestiones relacionadas