iphone - willapper - override viewwillappear
¿Qué método de funcionalidad similar(viewWillAppear) existe en UIView? (3)
Se llama a viewWillAppear en UIViewController cuando una vista está a punto de mostrarse en la pantalla. ¿Es posible obtener una devolución de llamada similar en UIView?
¿Qué tal lo siguiente de la referencia UIView
willMoveToSuperview :, didMoveToSuperview: implemente estos métodos según sea necesario para rastrear el movimiento de la vista actual en su jerarquía de vistas.
al menos, esto le indicará cuándo se agrega a una jerarquía de vistas, pero no hay garantía de que la jerarquía de vistas se presente / vea.
No, pero puede reenviar esa notificación a la vista deseada desde su controlador de vista.
- Tenga en cuenta que originalmente iba a publicar esta respuesta here pero como me preguntaron años antes, marqué esa como un duplicado y ahora responderé aquí en su lugar.
Solución Macro
He hecho una solución macro para esto que es muy elegante y fácil de usar.
.metro
Agrega lo siguiente a tu .m
-(void)viewDidLoad {
//normal stuff
}
__METHOD_MACRO_wasRemovedFromSuperview() {
//Code here will run whenever this view is removed from its superview
}
__METHOD_MACRO_wasAddedAsSubview() {
//Code here will run whenever this view is added as the subview of another view
}
¡Sip! ¡Realmente es así de fácil!
(Debido a cómo se configura a continuación la configuración ifdef de la macro, puede usar una o la otra o ambas).
.h
Agregue lo siguiente a su .h debajo de @end
(o, si desea mantener todo limpio, simplemente puede agregarlo a un archivo llamado macros.hy # importarlo)
Nota: si agrega esto (o lo importa) a varios archivos que también se importan entre sí o a @class, puede terminar arruinando la lógica #ifdef y esta macro podría fallar, sugiero que lo importe desde un archivo .h separado. para cada clase en la que lo necesita, esta macro se creó más como una prueba de concepto que algo que se utilizará en el código de producción
//Logic for __METHOD_MACRO_wasAddedAsSubview() and __METHOD_MACRO_wasRemovedFromSuperview()
#define startSuppressingWarnings() /
_Pragma("clang clang diagnostic push")/
_Pragma("clang diagnostic ignored /"-Weverything/"")
#define stopSuppressingWarnings() /
_Pragma("clang clang diagnostic pop")
#define __INTERNAL_METHOD_MACRO__didChangeSuperviewsSetup() /
-(void)didMoveToWindow {/
[super didMoveToWindow];/
if (self.window && self.superview) {/
startSuppressingWarnings()/*Hide potential undeclared selector warnings*//
if ([self respondsToSelector:@selector(__wasAddedAsSubview)]) {/
[self performSelector:@selector(__wasAddedAsSubview)];/
}/
stopSuppressingWarnings()/
} else {/
startSuppressingWarnings()/*Hide potential undeclared selector warnings*//
if ([self respondsToSelector:@selector(__wasRemovedFromSuperview)]) {/
[self performSelector:@selector(__wasRemovedFromSuperview)];/
}/
stopSuppressingWarnings()/
}/
}
#ifdef __INTERNAL_METHOD_MACRO__didChangeSuperviewsSetup_wasSetup
///Called when UIView was added as subview OR moved to another superview OR if another VC was presented
#define __METHOD_MACRO_wasAddedAsSubview() /
-(void)__wasAddedAsSubview/*{ //perform extra processes here }*/
#else
#define __INTERNAL_METHOD_MACRO__didChangeSuperviewsSetup_wasSetup 1
///Called when UIView was added as subview OR moved to another superview
#define __METHOD_MACRO_wasAddedAsSubview() /
__INTERNAL_METHOD_MACRO__didChangeSuperviewsSetup() /
-(void)__wasAddedAsSubview/*{ //perform extra processes here }*/
#endif
#ifdef __INTERNAL_METHOD_MACRO__didChangeSuperviewsSetup_wasSetup
///Called when UIView is removed as subview from superview or when its parent window is removed
#define __METHOD_MACRO_wasRemovedFromSuperview() /
-(void)__wasRemovedFromSuperview/*{ //perform extra processes here }*/
#else
#define __INTERNAL_METHOD_MACRO__didChangeSuperviewsSetup_wasSetup 1
///Called when UIView is removed as subview from superview
#define __METHOD_MACRO_wasRemovedFromSuperview() /
__INTERNAL_METHOD_MACRO__didChangeSuperviewsSetup() /
-(void)__wasRemovedFromSuperview/*{ //perform extra processes here }*/
#endif