UIView - ¿Cómo recibir una notificación cuando se carga la vista?

79

¿Hay algo similar al viewDidLoadde UIViewControllerpara UIView??? Necesito que se me notifique tan pronto como se UIViewhaya cargado (Subclase de UIView) y realizar algunas acciones.

aryaxt
fuente

Respuestas:

268

Según el tipo de acciones que deba realizar, existen varias técnicas:

  1. -(id)initWithFrame:(CGRect)frame- Inicializador designado de UIView; siempre se envía a una UIView para inicializarla, a menos que la vista se cargue desde una plumilla;
  2. -(id)initWithCoder:(NSCoder *)coder - siempre se envía para inicializar una UIView siempre que la vista se carga desde una plumilla;
  3. -(void)awakeFromNib- enviado después de que todos los objetos en la plumilla estén inicializados y conectados; aplicable solo si carga el objeto desde una plumilla; debes llamar super;
  4. -(void)willMoveToSuperview:(UIView *)newSuperview- enviado inmediatamente antes de que la vista se agregue como una subvista a otra vista; newSuperviewpuede ser nulo cuando quita la vista de su supervista;
  5. -(void)willMoveToWindow:(UIWindow *)newWindow- enviado inmediatamente antes de que la vista (o su supervista) se agregue a una ventana; newWindowpuede ser nulo cuando quita la vista de una ventana;
  6. -(void)didMoveToSuperview - enviado inmediatamente después de que la vista se inserta en una jerarquía de vista;
  7. -(void)didMoveToWindow- enviado inmediatamente después de que la vista obtiene su propiedad de ventana establecida. -

Básicamente, puede optar por realizar sus acciones durante la inicialización (1 y 2), después de cargar desde una punta (3), antes de la inserción en una jerarquía de vista (4 y 5) y después de eso (6 y 7).

Costique
fuente
Muchas gracias respuesta perfecta (muy detallada). Estaba modificando un control segmentado y no mostraba los cambios porque estaba llamando al método de modificación durante init, lo moví a didMoveToWindow y solucionó todos los problemas
aryaxt
1
Parece que todo esto sucedió antes de viewDidLoad en viewController
Alex Chan
3
-(void)willMoveToSuperview:(UIView *)newSuperviewfue la cura a todos mis problemas, muchas gracias!
Erion S
Olvidé de nuevo que algunas cosas no funcionan si las sigues llamando dentro de una UIView al comienzo del proceso de inicialización ... ¡Así que hacerlo en 7 o realizar con retraso desde allí siempre funcionará! :)
Alex Cio