2010-08-08 4 views
6

Antes de iOS4, el controlador de vista inicial de mi aplicación verificaba una variable de configuración de contraseña activada/desactivada en viewWillAppear y, si estaba activada, presentaba una contraseña modal que permanecería allí hasta que se ingresara la contraseña correcta o Botón de inicio fue presionado.Usando applicationwillenterforeground para una pantalla de código

Con iOS4, si mi aplicación ha estado en segundo plano, me gustaría que el usuario se sienta cómodo de que los datos contenidos en la aplicación no sean de fácil acceso si tuvieran que entregar su teléfono a alguien para usar.

Dado que la aplicación podría volver a cualquier pantalla (la última pantalla en la que estaba la aplicación), pensé que usaría la UIApplicationWillEnterForegroundNotification por todos lados con selectores locales (métodos enterPasscode duplicados), cada uno con el controlador de vista correcto para empuje basado en la pantalla local, pero tiene que haber una mejor manera.

Puedo estar teniendo un ligero malentendido conceptual aquí. ¿Puede alguien sugerir otro enfoque o empujarme hacia el próximo paso? ¿Puedo tener esto como un método compartido pero aún así conocer el controlador de vista local correcto para enviar?

Gracias

EDIT/UPDATE:

versión corta: Funciona, pero puede que todavía puede haber una mejor manera (cualquier ayuda apreciada) ...

he creado un producto único estándar con un controlador de vista.

PasscodeView.h que contienen:

UIViewController *viewController; 
@property (nonatomic, retain) UIViewController *viewController; 

PasscodeView.m que contienen:

@synthesize viewController; 

que poner esto en el AppDelegate:

-(void)applicationWillEnterForeground:(UIApplication*)application { 

    PasscodeView *passcodeView = [PasscodeView sharedDataManager]; 
    UIViewController *currentController = [passcodeView viewController]; 
    NSLog(@"%@", currentController); //testing 
    EnterPasscode *passcodeInput = [[EnterPasscode alloc] initWithNibName:@"Passcode" bundle:nil]; 
    [currentController presentModalViewController:passcodeInput animated:NO]; 
    [passcodeInput release]; 
} 

y la siguiente en toda mi viewDidLoad, actualizando el controlador de vista actual cuando entré en cada pantalla (solo 2 líneas pero aún parece que hay ' Es una manera mejor):

PasscodeView *passcodeView = [PasscodeView sharedSingleton]; 
passcodeView.viewController = [[self navigationController] visibleViewController]; 

Me gustaría que hubiera una manera de haber conseguido el controlador de vista actual de applicationWillEnterForeground pero no pude encontrarlo - cualquier ayuda aquí todavía apreciado.

Para mayor coherencia, cambié una línea y agregué una línea para obtener una barra de navegación que coincidiera con el resto de la aplicación e incluyera un título.

UINavigationController *passcodeNavigationController = [[UINavigationController alloc] initWithRootViewController:passcodeInput]; 
[currentController presentModalViewController: passcodeNavigationController animated:NO]; 

Respuesta

3

Puede centralizar este comportamiento en delegado de la aplicación mediante la implementación de

-(void)applicationWillEnterForeground:(UIApplication*)application; 

Es posible aplicar un producto único que almacena el controlador de vista modal momento apropiado, actualizándolo en viewWillAppear en cada uno de sus controladores de vista.

Editar: Asumí que ya tenía una serie de controladores de vista que quería mostrar. Dudo que realmente lo necesites.Si usted tiene una llamada, digamos PasscodeInputController, entonces su applicationWillEnterForeground sería algo como:

-(void)applicationWillEnterForeground:(UIApplication*)application { 
    UIViewController *currentController = [window rootViewController]; 
    PasscodeInputController *passcodeInput = [[PasscodeInputController alloc] init]; 

    [currentController presentModalViewController:passcodeInput animated:NO]; 
    [passcodeInput release]; 
} 

espero que las direcciones a su pregunta de manera más directa.

+0

Aquí es donde comencé, pero no sabía qué poner para un controlador de vista. Lo pensaré un poco y lo intentaré. –

+0

ver las ediciones anteriores. –

+0

Entiendo conceptualmente lo que está intentando hacer: presentar aquí una pantalla de código de acceso en lugar de cada controlador de vista: parece que debería funcionar, pero no es así. Copió el código exactamente como está (cambió PasscodeInputController a EnterPasscode), crea bien, sin errores, sin advertencia, pero no aparece nada. Al principio no estaba familiarizado con la propiedad rootViewController de UIWindow, pero después de leer qué es, parece que debería funcionar, aunque no pude encontrar ningún otro ejemplo. Intenté un par de cosas más: intenté usar un controlador de navegación, intenté una subvista, makeKeyAndVisible pero nada. –

1

El comportamiento de su aplicación al volver a entrar en primer plano debe ser lo más similar posible a cuando se inicia por primera vez. Con esto en mente, puede combinar su applicationDidFinishLaunching: con applicationWillEnterForeground:, pero teniendo en cuenta que algunas vistas ya pueden estar cargadas. El código es algo como esto:

id myState = (isReentering) ? [self validateState] : [self loadStateFromSave]; 
NSArray * keyForObjectToLoad = [self objectsToLoadForState:myState]; 
for(NSString * key in keyForObjectToLoad) 
    if(![self objectForKey:key]) [self loadObjectForKey:key]; 

Dependiendo de detalles de la aplicación podría requerir un trabajo inicial, pero tiene algunas ventajas:

  • Con ello se garantizará el lanzamiento y relanzamiento son similares, por lo tanto, la experiencia del usuario no es "aleatorio"
  • Puede liberar muchas memorias no deseadas más fácilmente cuando está en segundo plano.
  • Es más fácil administrar el estado de su aplicación desde un lugar central.
Cuestiones relacionadas