2011-03-05 10 views
10

Todavía soy muy nuevo en Objective C, y me preguntaba algo sobre viewDidDisappear. Tengo una aplicación que reproduce un sonido (usando AVAudioPlayer), y quiero detener el sonido cuando se cambia la vista.iPhone: ¿Cuál es el uso correcto de viewDidDisappear?

Si hago esto en mi opinión implementación del controlador:

- (void)viewDidDisappear:(BOOL)animated { 
    [self.audioPlayer stop]; 
} 

funciona bien. Pero el pequeño programador en mi cerebro está diciendo que no estoy usando esto correctamente. Estoy bastante seguro de que debes llamar a viewDidDisappear con un argumento booleano, en lugar de solo especificar (BOOL) animado; además, sería bueno tener algo de animación en mi vista cambiando ... ¡otra vez, eso podría ser una discusión completamente diferente!

Entonces, ¿qué estoy haciendo mal y cómo usaría esto correctamente? ¿Debo vincular la llamada a una acción de botón? ¿Dónde está la jugada correcta para declarar la función en sí misma? Gracias.

Respuesta

16

implemento viewDidDisappear:(BOOL)animatedEXTENSIVAMENTE, junto con viewWillAppear, viewWillDisappear y viewWillDisappear La razón principal para poner en práctica este método es hacer que su controlador de vista de hacer algo en el evento, como viewDidDisappear No llama a este método, pero su aplicación llamará a su controlador de vista para hacer lo que allí se implementó. Dado que este es un método heredado, siempre que se asegure de que se pueda realizar toda la implementación heredada de la superclase, es genial implementar viewDidDisappear. Por lo tanto, sugiero que cambie su código para ser así:

- (void)viewDidDisappear:(BOOL)animated { 
    [super viewDidDisappear:(BOOL)animated]; // Call the super class implementation. 
    // Usually calling super class implementation is done before self class implementation, but it's up to your application. 

    [self.audioPlayer stop]; 
} 
10

- (void)viewDidDisappear:(BOOL)animated es una declaración de método, no una llamada de ningún tipo. El método en sí es llamado por UIKit ya que los controladores de vista son manipulados; no necesita llamarlo usted mismo a menos que esté escribiendo su propio código que hace que los controladores de visualización aparezcan y desaparezcan manipulando directamente las vistas que controlan (por ejemplo, si estaba reescribiendo UINavigationController por algún motivo).

Usted está haciendo algo mal, sin embargo: debe llamar al [super viewDidDisappear:animated] en algún lugar de su implementación, o las cosas pueden romperse.

+0

Así que supongo que lo entendí más o menos correctamente, ¡GRACIAS! Sin embargo, ¿podría explicar la llamada [super viewDidDisappear: animated]? No estoy completamente al tanto de todo el súper negocio ... Actualmente soy un peligro de codificación: p ¿Qué pasaría si lo dejara? – seeafish

2

viewDidDisappear: es un método opcional que su vista puede utilizar para ejecutar código personalizado cuando la vista realmente desaparece. No es necesario que tengas esto en tu vista, y tu código debería (¿casi?) Nunca necesitar llamarlo.

4

La voz "pequeño programador" en su mente es probablemente más utilizados para la codificación de forma, si se llama al sistema operativo y decirle qué hacer. En cambio, Cocoa Touch usa un paradigma basado en eventos, donde su programa tiene rutinas (métodos) que el sistema operativo (marco) llama cuando está listo y listo. viewDidDisappear es una de esas rutinas. Simplemente siéntate y espera a que el sistema operativo lo llame (suponiendo que hayas configurado todo correctamente)

+0

Sí ... PHP es mi fuerte, y debo decir que estoy empezando a familiarizarme con el OO correcto y todo el asunto de MVC. Sin embargo, en este caso, realmente necesito que la aplicación haga algo cuando la vista desaparece. ¿Eso no justificaría la necesidad de decir a mi vista que use viewDidDisappear para poder hacerlo? – seeafish

+0

@capitales: No. Lo contrario. Usted no dice la vista. Cuando la vista desaparece, el sistema operativo se lo dice. – hotpaw2

+1

woah ... objetivo c sabe kung fu! Creo que entiendo un poco lo que quieres decir.Pero siguiendo la lógica, debería ser capaz de comprobar de alguna manera si ViewDidDisappear y el SO debería responder con "sí lo hizo", ¿correcto? – seeafish

Cuestiones relacionadas