UIViewController viewDidLoad vs. viewWillAppear: ¿Cuál es la división adecuada del trabajo?


164

Siempre he sido un poco confuso sobre el tipo de tareas que deberían asignarse a viewDidLoadvs. viewWillAppearen una UIViewControllersubclase.

por ejemplo, estoy haciendo una aplicación en la que tengo una UIViewControllersubclase que golpea un servidor, obtengo datos, los llevo a una vista y luego los visualizo. ¿Cuáles son los pros y los contras de hacer esto en viewDidLoadcontra viewWillAppear?

Respuestas:


251

viewDidLoad es cosas que debes hacer una vez. Se llama a viewWillAppear cada vez que aparece la vista. Debe hacer cosas que solo tiene que hacer una vez en viewDidLoad, como configurar sus textos de UILabel. Sin embargo, es posible que desee modificar una parte específica de la vista cada vez que el usuario puede verla, por ejemplo, la aplicación iPod desplaza la letra hacia arriba cada vez que accede a la vista "Reproducción en curso".

Sin embargo, cuando está cargando cosas desde un servidor, también debe pensar en la latencia. Si empaqueta toda su comunicación de red en viewDidLoad o viewWillAppear, se ejecutarán antes de que el usuario vea la vista, lo que posiblemente genere un breve congelamiento 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. Se pueden ver buenos ejemplos de cómo se puede hacer esto 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 se hayan completado las consultas de red.


Entonces, con respecto a viewWillAppear, se puede llamar repetidamente. ¿Se dispararía ese método si, por ejemplo, la vista viewcontrollers se hiciera visible después de haber estado oculta (quiero decir, ocluida aquí, no el método oculto en UIView)? ¿En qué escenario se llamaría viewWillAppear sin ser precedido por una llamada a viewDidLoad?
dugla

77
viewDidLoad SOLO recibe una llamada cuando se construye la vista, por ejemplo, después de una llamada initFromNibNamed del controlador de vista cuando se accede a la vista. Se llama a viewWillAppear cada vez que su controlador de vista no estaba a la vista pero aparece, por lo que cuando se presiona su controlador de vista, se llama a viewWillAppear. Si empuja otra subvista desde allí, y el usuario regresa, se llama nuevamente a viewWillAppear.
Kendall Helmstetter Gelner el

Gracias Kendall Sí, unos NSLogs estratégicamente ubicados me ordenaron. viewWillAppear / viewWillDissappear fuego en viewcontroller push / pops.
dugla

3
Tenga en cuenta que viewDidLoad TAMBIÉN recibirá una llamada si la vista está oculta y luego se descarga por razones relacionadas con la memoria, luego vuelve a aparecer. Con lo que puede contar: viewDidLoad se llamará AL MENOS UNA VEZ cuando la vista se cree por primera vez y POSIBLEMENTE más veces cuando la vista vuelva a aparecer después de estar oculta. viewWillAppear SIEMPRE se llamará cuando la vista esté a punto de aparecer en pantalla.
DanM

2
¿Puede alguien comentar más sobre estas dos preguntas relacionadas: (1) A veces, no siempre, los valores de marco para los controles (es decir, origen y tamaño) son cero en viewDidLoad, y a veces no - ¿Por qué? (2) En la plantilla de Apple para splitViewController detailView (iPad), hay un método configureView: ¿qué debería incluir allí en relación con viewDidLoad y ViewWillAppear?
Jeff

12

Inicialmente solo se usa ViewDidLoad con tableView. Al probar con la pérdida de Wifi, al configurar el dispositivo en modo avión, se dio cuenta de que la tabla no se actualizó con el regreso de Wifi. De hecho, parece que no hay forma de actualizar tableView en el dispositivo incluso presionando 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 usar 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 ...)

Esta publicación describe bastante bien los diferentes métodos y lo que sucede en cada uno de ellos.

actualmente para un inicio y posicionamiento únicos Estoy pensando en usar viewDidAppear con una bandera, si alguien tiene alguna otra recomendación, por favor hágamelo saber.


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

4

Depende: ¿Necesita cargar los datos cada vez que abre la vista? o solo una vez ?

ingrese la descripción de la imagen aquí

  • 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 los mismos 3 usuarios sugeridos a seguir, debe volver a cargarse cada vez que regrese a la pantalla. Sus fotos pueden actualizarse ... no desea ver una foto de hace 5 años ...

viewDidLoad:Cualquier procesamiento que tenga que debe hacerse una vez.
viewWilLAppear:Cualquier procesamiento que necesite cambiar cada vez que se carga la página.

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


El violeta se llamaría en la vista No apareció la vista No aparecerá
Alex Kornhauser

@AlexKornhauser, ¿qué quieres decir con que se llamaría? Estoy diciendo viewWillAppearque puedes consultar y consultar los últimos tweets. viewDidAppeares demasiado tarde para eso
Honey
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.