objective-c - learn - objective c documentation
¿Qué método se llama después de ''applicationDidBecomeActive''? (2)
es mi primera pregunta aquí, ya que tengo un problema para desarrollar mi primera aplicación iOS. Es una de las miles de aplicaciones de linterna, sin embargo, estoy tratando de ponerle tantas características como sea posible. Uno de ellos guarda el estado de la aplicación cuando se queda en segundo plano o finaliza. Después de ir al primer plano (iOS 4 o superior) o relanzar, estoy cargando la configuración del archivo y volviéndolo a aplicar. Una de las configuraciones es, obviamente, el AVCaptureDevice.torchMode
. Sin embargo, encuentro el problema con esto. Estoy volviendo a aplicar estas configuraciones en el método applicationDidBecomeActive
. Parece que todo funciona, pero cuando toco rápidamente el botón de inicio seguido de relanzar una aplicación, la aplicación hará lo siguiente (retrasé el método applicationDidBecomeActive
para observarlo):
1. muestra una pantalla negra (cargando)
2. ejecuta applicationDidBecomeActive
y enciende el LED (pongo mi retraso aquí)
3. muestra mi UIViewController
actual y en el mismo momento apaga el LED
Solo ocurre después de llamar a una aplicación desde el fondo justo después de que se envió allí. Sé que no es el caso de uso realista, pero me gusta pensar que los errores suelen "acumularse" y que debido a este (posiblemente) mal diseño podría encontrar otros problemas en el futuro. Estoy absolutamente seguro de que este no es mi código que apaga el LED desde que NSLog
cada vez que mi código modifica la propiedad AVCaptureDevice.torchMode
. Entonces, para ser exactos, mi pregunta es:
¿A qué método se llama después de applicationDidBecomeActive
, posiblemente relacionado con UIViewController
, que podría apagar mi linterna? ¿Y hay alguna solución posible o solución alternativa?
De acuerdo con la guía de programación de aplicaciones de iOS :
Volver al primer plano es la oportunidad de que su aplicación reinicie las tareas que detuvo cuando se movió al fondo. Los pasos que ocurren cuando se mueve al primer plano se muestran en la Figura 3-6. El método applicationWillEnterForeground: debe deshacer todo lo que se hizo en su método applicationDidEnterBackground: y el método applicationDidBecomeActive: debe continuar realizando las mismas tareas de activación que en el momento del lanzamiento .
¿Ha intentado volver a aplicar su configuración en el método applicationDidBecomeActive:
lugar de la applicationWillEnterForeground:
:?
Otra cosa a considerar es trabajar con notificaciones:
En la applicationDidBecomeActive:
o applicationDidBecomeActive:
métodos de AppDelegate, puede decirle al delegado de su aplicación que envíe notificaciones a sus controladores:
- (void)applicationDidBecomeActive:(UIApplication *)application {
/*
Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
*/
// Dispatch notification to controllers
[[NSNotificationCenter defaultCenter] postNotificationName: @"didBecomeActive"
object: nil
userInfo: nil];
}
Una vez que tenga esto, el controlador de vista puede registrarse para estas notificaciones (en su método init, por ejemplo) así:
[[NSNotificationCenter defaultCenter] addObserver: self
selector: @selector(loadSettings)
name: @"didBecomeActive"
object: nil];
De esta forma, su controlador es consciente de que la aplicación acaba de activarse y puede ejecutar cualquier método que desee.
En este ejemplo, le está diciendo a su controlador de vista que ejecute el método loadSettings
cuando recibe la notificación didBecomeActive
(que fue publicada por el delegado de la aplicación).
Solo tengo una respuesta sobre por qué un inicio de parada rápido de la aplicación mostrará una pantalla negra, no tengo referencia, solo experiencia personal y observación.
Cuando la aplicación se envía a segundo plano, el SO intenta tomar una captura de pantalla para usar en lugar de Default.png
. Si inicia la aplicación antes de que se tome una captura de pantalla y no tiene un Default.png
en su proyecto, entonces lo obtendrá.
Todavía pensando en tu pregunta real.