2011-05-23 11 views
5

Quiero bloquear a los usuarios de mi aplicación después de un período de tiempo en segundo plano. Estoy detectando esto en el AppDelegate's applicationWillEnterForeground (y comparando con el tiempo almacenado en applicationWillResignActive). Si es menor que el período de tiempo de espera, no se lleva a cabo ninguna acción. Si hay más tiempo que el tiempo de espera, llamo a:Alter view before applicationWillEnterForeground

[_navigationController popToRootViewControllerAnimated:NO]; 

que devuelve al usuario a la vista raíz.

Funciona perfectamente bien con una interrupción visual. La vista anterior (la que el usuario estaba viendo cuando la aplicación quedó inactiva) aparece muy brevemente antes de hacer clic en la raíz. En las pruebas, parece que la vista reaparece antes de llamar al applicationWillEnterForeground.

La única idea que he tenido es ocultar todo antes de pasar a inactivo, como oscurecer la vista con un rectángulo lleno. Esto huele como un sucio truco para mí, así que estoy pensando que hay una mejor manera.

También estoy abierto a diferentes formas de alcanzar el mismo resultado final. ¡Gracias!

+0

¿A dónde llamas exactamente desde el método popToRootViewController? – TheBlack

+0

@TheBlack: estoy llamando '[_navigationController popToRootViewControllerAnimated: NO]' en el método 'applicationWillEnterForeground' de Application Delegate. –

+0

Si abrió los controladores de vista en applicationWillResignActive, su problema se resolvería, pero eso no encaja en su concepto. De todos modos, mostrar VCs en applicationWillResignActive es el lugar correcto para hacerlo. Mi solución fue mostrar siempre VC y restaurarlos si el usuario volvía a la aplicación en algún intervalo. – TheBlack

Respuesta

0

He resuelto esto haciendo que la vista sea invisible. En applicationWillResignActive tengo _navigationController.view.alpha = 0 ;, y he colocado _navigationController.view.alpha = 100; en applicationWillEnterForeground después (si es necesario) apareciendo en la vista de inicio de sesión. Es más fácil que abrir y restaurar vistas (que en este caso son bastante pesadas).

@TheBlack señala la propiedad oculta, que es probablemente un poco más fácil en el dispositivo. Voy a dejar alfa porque A) es divertido depurar con una vista alfa del 50%, y B) Simplemente me gusta alfa. Pero a menos que seas un fanático alfa como yo, oculto podría ser un poco mejor.

0

A partir de los documentos: Strategies for Handling App State Transitions

Prepárese para la aplicación de instantáneas

Poco después applicationDidEnterBackground de un delegado de la aplicación: devuelve el método, el sistema toma una instantánea de las ventanas de la aplicación. Del mismo modo, cuando se despierta una aplicación para realizar tareas en segundo plano, el sistema puede tomar una nueva instantánea para reflejar los cambios relevantes. Por ejemplo, cuando se despierta una aplicación para procesar elementos descargados, el sistema toma una nueva instantánea para que pueda reflejar cualquier cambio causado por la incorporación de los elementos. El sistema usa estas imágenes instantáneas en la interfaz de usuario multitarea para mostrar el estado de su aplicación.

Si realiza cambios en sus vistas al ingresar el fondo, puede llamar al método snapshotViewAfterScreenUpdates: de su vista principal para forzar que se realicen dichos cambios. Llamar al método setNeedsDisplay en una vista no es efectivo para las instantáneas porque la instantánea se toma antes del siguiente ciclo de dibujo, evitando así que se muestren los cambios. Llamar al método snapshotViewAfterScreenUpdates: con un valor de YES obliga a una actualización inmediata de los búferes subyacentes que utiliza la maquinaria de instantáneas.

Cuestiones relacionadas