tutorial life example containerviewcontroller container iphone xamarin.ios viewdidload viewdidappear viewwillappear

iphone - life - ¿Agrego programáticamente subvistas en ViewDidAppear, ViewDidLoad, ViewWillAppear, el constructor?



lifecycle viewcontroller ios (3)

Estoy intentando averiguar a partir de la documentación sketchy de Apple qué método es el mejor lugar para inicializar y agregar mis controles de Vistas a la vista del controlador.

Con winforms es bastante sencillo, ya que siempre se inicializan dentro de InitializeDesigner , llamado en el constructor. Estoy tratando de igualar la fiabilidad de este patrón si es posible.

Estoy trabajando con UIViewControllers y UITableViewControllers dentro de un UINavigationController mayor parte del tiempo, si esto lo afecta todo.

Aquí hay un ejemplo:

public MyController() { // Here? AddViews(); } public override ViewDidLoad() { base.ViewDidLoad(); // Or is should it be here? AddViews(); } public override ViewWillAppear(bool ) { base.ViewWillAppear(animated); // Here? AddViews(); } public override ViewDidAppear(bool animated) { base.ViewDidLoad(animated); // Or maybe here? AddViews(); } void AddViews() { UILabel label = new UILabel(); label.Text = "Test"; label.Frame = new RectangleF(100,100,100,26); View.AddSubView(label); UIWebView webview = new UIWebView(); webview .Frame = new RectangleF(100,100,100,26); View.AddSubView(webview); }

Obtengo resultados mixtos con algunos controles UIC cuando los agrego a la vista en diferentes lugares. Retraso visual a veces, otras veces la vista web está oculta en algún lugar.

¿Hay alguna regla general que cumplir para agregarlos?


En general, esto es lo que hago:

  • ViewDidLoad : cada vez que agrego controles a una vista que debería aparecer junto con la vista, de inmediato, lo puse en el método ViewDidLoad. Básicamente, este método se llama siempre que la vista se carga en la memoria. Así, por ejemplo, si mi vista es un formulario con 3 etiquetas, agregaría las etiquetas aquí; La vista nunca existirá sin esas formas.

  • ViewWillAppear : uso ViewWillAppear generalmente solo para actualizar los datos en el formulario. Entonces, para el ejemplo anterior, usaría esto para cargar realmente los datos de mi dominio en el formulario. La creación de UIViews es bastante costosa, y usted debe evitar todo lo posible haciendo eso en el método ViewWillAppear, ya que cuando se llame, significa que el iPhone ya está listo para mostrar la UIView al usuario, y cualquier cosa importante que haga aquí. afectará el rendimiento de manera muy visible (como retrasar las animaciones, etc.).

  • ViewDidAppear : Finalmente, utilizo ViewDidAppear para comenzar nuevos subprocesos a cosas que tardarían mucho tiempo en ejecutarse, como por ejemplo hacer una llamada de servicio web para obtener datos adicionales para el formulario de arriba. Lo bueno es que la vista ya existe. y se le muestra al usuario, puede mostrar un bonito mensaje de "Esperando" al usuario mientras obtiene los datos.

Sin embargo, hay otros trucos que puedes usar. Digamos que desea que una UILabel "vuele" en el formulario después de que se carga el formulario. En ese caso, agregaría la etiqueta al formulario en ViewDidLoad pero con un Marco fuera del área de visualización, y luego en ViewDidAppear haría la animación para volver a mostrarla.

Espero eso ayude.


Hmm, los documentos de Apple parecen ser bastante claros, IMHO.

Si crea su propia vista raíz (la vista raíz de la jerarquía de vista de este controlador en particular) mediante programación, debe crearla en -loadView sin llamar a super y establecer la propiedad de view cuando -loadView . Si su vista se carga desde una punta, no debe tocar -loadView .

Agregue subvistas personalizadas a la vista del controlador de la vista o, de lo contrario, -viewDidLoad en -viewDidLoad . La práctica recomendada es crear su UILabel y UIWebView en -viewDidLoad y lanzarlos en -viewDidUnload , estableciendo sus referencias en nil si necesita mantenerlas en archivos iv.

Nota: -viewDidUnload está en desuso en iOS 6 y simplemente ya no se llama, porque UIViewController ya no purga su vista bajo la presión de la memoria.


viewDidLoad se relaciona con ''MEMORY'', y viewWillAppear / viewDidAppear se relaciona con ''APARIENCIA''. La vista de un controlador de vista (que es una vista de raíz de las vistas de su controlador de vista) puede aparecer / desaparecer varias veces, incluso si la vista del controlador ya está en la memoria.

(Cuando me refiero a la vista de raíz, también me refiero a sus subvistas, porque la vista de raíz tiene una referencia a sus elementos secundarios (subvistas), pero desde la perspectiva de un controlador de vista, generalmente conoce solo la vista de raíz. La referencia a subvistas puede ocurrir normalmente. a través de puntos de vista del controlador de vista.)

La vista de raíz en sí PUEDE eliminarse de la memoria cuando hay una advertencia de memoria. El controlador de vista determinará cuándo es el mejor momento para eliminarlos de la memoria.

Por lo tanto, normalmente agregaría subvistas en viewDidLoad, porque agregar subvistas significa agregarlas a la memoria. PERO no si creas todas tus vistas programáticamente (no desde un archivo de plumilla). Si ese es el caso, entonces debe anular el método loadView, y crear una vista de raíz y agregar subvistas allí, por lo que en este caso puede omitir viewDidLoad para agregar subvistas.