2009-10-16 15 views
146

Siempre he estado un poco confuso sobre el tipo de tareas que deberían asignarse a viewDidLoad frente a viewWillAppear: en una subclase UIViewController.UIViewController viewDidLoad vs. viewWillAppear: ¿Cuál es la división del trabajo adecuada?

p. Ej. Estoy haciendo una aplicación donde tengo una subclase UIViewController golpeando un servidor, obteniendo datos, alimentándolo a una vista y luego mostrando esa vista. ¿Cuáles son los pros y los contras de hacer esto en viewDidLoad frente a viewWillAppear?

Respuesta

236

viewDidLoad es lo que tienes que hacer una vez. viewWillAppear se llama cada vez que aparece la vista. Debería hacer cosas que solo tiene que hacer una vez en viewDidLoad, como configurar sus textos UILabel. Sin embargo, es posible que desee modificar una parte específica de la vista cada vez que el usuario la vea, p. la aplicación iPod desplaza la letra hacia la parte superior cada vez que va a la vista "Reproducción en curso".

Sin embargo, cuando carga cosas desde un servidor, también debe pensar en la latencia. Si empaqueta todas sus comunicaciones de red en viewDidLoad o viewWillAppear, se ejecutarán antes de que el usuario vea la vista, lo que podría resultar en una congelación corta de su aplicación. Puede ser una buena idea mostrar primero al usuario una vista despoblada con un indicador de actividad de algún tipo. Cuando haya terminado con su red, que puede tomar uno o dos segundos (o incluso puede fallar, ¿quién sabe?), Puede completar la vista con sus datos. Buenos ejemplos de cómo se puede hacer esto se pueden ver en varios clientes de Twitter. Por ejemplo, cuando ve la página de detalles del autor en Twitterrific, la vista solo dice "Cargando ..." hasta que las consultas de la red se hayan completado.

+0

Por lo tanto, con respecto a viewWillAppear se puede llamar de manera repetitiva. ¿Se desencadenaría ese método si, por ejemplo, la vista viewcontrollers se volviera visible después de haber sido ocultada (me refiero a ocluded aquí, no el método oculto en UIView). ¿En qué escenario se vería invocar a WillAppear sin ir precedido de una llamada a viewDidLoad? – dugla

+5

viewDidLoad SÓLO se llama cuando se construye la vista, por ejemplo después de un controlador de vista llamada initFromNibNamed cuando se accede a la vista. viewWillAppear se invoca en cualquier momento que su controlador de vista no estaba a la vista, pero aparece en pantalla, de modo que cuando se pulsa su controlador de vista, se llama a viewWillAppear. Si inserta otra subvista desde allí y el usuario regresa, se llama de nuevo a viewWillAppear. –

+0

Gracias Kendall. Yah, algunos NSLogs estratégicamente ubicados me han ordenado. viewWillAppear/viewWillDissappear disparar en viewcontroller push/pops. – dugla

11

Inicialmente solo se usó ViewDidLoad con tableView. En las pruebas con pérdida de Wifi, al configurar el dispositivo en modo avión, se dio cuenta de que la tabla no se actualizaba con el retorno de Wifi. De hecho, parece que no hay forma de actualizar TableView en el dispositivo incluso pulsando el botón de inicio con el modo de fondo establecido en SÍ en -Info.plist.

Mi solución:

-(void) viewWillAppear: (BOOL) animated { [self.tableView reloadData];} 
10

Es importante tener en cuenta que el uso de viewDidLoad para el posicionamiento es un poco arriesgado y debe evitarse ya que los límites no están establecidos. esto puede causar resultados inesperados (tuve una variedad de problemas ...)

This post describe bastante bien los diferentes métodos y lo que sucede en cada uno de ellos.

actualmente para iniciación y posicionamiento por única vez Estoy pensando en usar viewDidAppear con una bandera, si alguien tiene alguna otra recomendación, por favor avíseme.

+0

de acuerdo con esto: "... se debe evitar ya que los límites no están establecidos ..." – danisupr4

3

Depende, ¿Necesita los datos que se cargarán cada vez que abre la vista? o solo una vez?

enter image description here

  • Rojo: No requieren cambiar cada vez. Una vez que están cargados se quedan como estaban.
  • Púrpura: Necesitan cambiar con el tiempo o después de cargar cada vez. No desea ver a los mismos 3 usuarios sugeridos a seguir, necesita volver a cargar cada vez que regrese a la pantalla. Sus fotos pueden actualizarse ... no quieres ver una foto de hace 5 años ...

viewDidLoad: Sea cual sea el procesamiento que tiene que hay que hacer una vez.
viewWilLAppear: Cualquier proceso que necesite cambiar cada vez que se cargue la página.

Las etiquetas, los iconos, los títulos de los botones o la mayoría de los datosInputedByDeveloper generalmente no cambian. Nombres, fotos, enlaces, estado de los botones, listas (matrices de entrada para sus tableViews o collectionView) o la mayoría de los datosInputByUser generalmente cambian.

Cuestiones relacionadas