iphone - que - Mostrando el controlador de vista de inicio de sesión antes del controlador de barra de pestañas
control por boton iphone (1)
Usaría el método para presentar el controlador de vista de forma modal en lugar de agregarlo a la ventana. Eso hará que conserve adecuadamente el controlador. El mensaje de depuración tiene que ver con ciertos métodos de autorrotación que se implementan en su clase. Puedes ignorarlo por ahora.
Estoy creando una aplicación para iPad con un controlador de barra de pestañas que requiere iniciar sesión. Entonces, en el lanzamiento, quiero mostrar un LoginViewController y si el inicio de sesión es exitoso, entonces mostrar el controlador de la barra de pestañas. Así es como implementé una versión de prueba inicial (excluí algunas cosas típicas del encabezado, etc.) ...
AppDelegate.h:
@interface AppDelegate_Pad : NSObject
<UIApplicationDelegate, LoginViewControllerDelegate> {
UIWindow *window;
UITabBarController *tabBarController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
@end
AppDelegate.m:
@implementation AppDelegate_Pad
@synthesize window;
@synthesize tabBarController;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
LoginViewController_Pad *lvc = [[LoginViewController_Pad alloc] initWithNibName:@"LoginViewController_Pad" bundle:nil];
lvc.delegate = self;
[window addSubview:lvc.view];
//[lvc release];
[window makeKeyAndVisible];
return YES;
}
- (void)loginViewControllerDidFinish:(LoginViewController_Pad *)loginViewController {
[window addSubview:tabBarController.view];
}
- (void)dealloc {...}
@end
LoginViewController_Pad.h:
@protocol LoginViewControllerDelegate;
@interface LoginViewController_Pad : UIViewController {
id<LoginViewControllerDelegate> delegate;
}
@property (nonatomic, assign) id <LoginViewControllerDelegate> delegate;
- (IBAction)buttonPressed;
@end
@protocol LoginViewControllerDelegate
-(void)loginViewControllerDidFinish:(LoginViewController_Pad *)loginViewController;
@end
LoginViewController_Pad.m:
@implementation LoginViewController_Pad
@synthesize delegate;
...
- (IBAction)buttonPressed
{
[self.view removeFromSuperview];
[self.delegate loginViewControllerDidFinish:self];
}
...
@end
Por lo tanto, el delegado de la aplicación agrega la vista del controlador de vista de inicio de sesión al momento del lanzamiento y espera el inicio de sesión para llamar a "finalizó" utilizando un delegado. El controlador de vista de inicio de sesión llama a removeFromSuperView antes de invocar didFinish. El delegado de la aplicación llama a addSubView en la vista del controlador de la barra de pestañas.
Si llegaste hasta este punto, gracias, y tengo tres preguntas:
PREGUNTA PRINCIPAL: ¿Es esta la manera correcta de mostrar un controlador de vista antes de que se muestre el controlador de la barra de pestañas principal de la aplicación? Aunque parece funcionar, ¿es una forma adecuada de hacerlo?
Si comento el "lanzamiento de lvc" en el delegado de la aplicación, la aplicación se bloquea con EXC_BAD_ACCESS cuando se presiona el botón en el controlador de vista de inicio de sesión. ¿Por qué?
Con la "versión de lvc" comentada, todo parece funcionar, pero en la consola del depurador escribe este mensaje cuando el delegado de la aplicación llama a addSubView para el controlador de la barra de pestañas: utilizando la animación de rotación de dos etapas. Para utilizar la animación más uniforme de una etapa, esta aplicación debe eliminar las implementaciones de métodos de dos etapas. ¿Qué significa eso y debo preocuparme por ello?
ACTUALIZACIÓN: según lo sugerido por lucius, lo cambió para mostrar modalmente el controlador de vista de inicio de sesión desde el delegado de la aplicación. Esto parece ser una solución más limpia. Código cambiado de la siguiente manera ...
AppDelegate.m:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[window addSubview:tabBarController.view];
[window makeKeyAndVisible];
LoginViewController_Pad *lvc = [[LoginViewController_Pad alloc] initWithNibName:@"LoginViewController_Pad" bundle:nil];
lvc.delegate = self;
[self.tabBarController presentModalViewController:lvc animated:NO];
[lvc release];
return YES;
}
-(void)loginViewControllerDidFinish:(LoginViewController_Pad *)loginViewController {
[self.mainTabBarController dismissModalViewControllerAnimated:NO];
}
LoginViewController_Pad.m:
- (IBAction)buttonPressed
{
//do NOT removeFromSuperview, delegate will dismiss
//[self.view removeFromSuperview];
[self.delegate loginViewControllerDidFinish:self];
}