2008-12-04 18 views
14

Cuando se accede a la propiedad view de un UIViewController, primero verifica si tiene una vista existente y la devuelve. Si no, carga su punta o llamadas -loadView.¿La mejor manera de determinar si un UIViewController se ha cargado y tiene una vista válida?

Cuando un controlador recibe un mensaje -didReceiveMemoryWarning, el comportamiento predeterminado es eliminar esa vista en caché (suponiendo que no esté en uso en ese momento).

Si reemplazo -didReceiveMemoryWarning, ¿cómo puedo determinar si la vista se ha borrado? Según entiendo, la implementación predeterminada verifica si self.view.superview == nil. Si es así, borra la vista en caché. Por supuesto, primero verifica si hay es una vista en caché, y si no, no hace nada. Sin embargo, yo, como una subclase, no puedo llamar a self.view.superview, porque si hay no es una vista, generará una.

Entonces, ¿cómo averiguo si _view existe? (No puedo simplemente mirar _view; tengo errores de enlace cuando construyo para el dispositivo).

Respuesta

3

creo en su situación lo mejor es hacer algo como:

- (void)setView:(UIView *)view 
{ 
    if (!view) 
    { 
     // Clean up code here 
    } 

    [super setView:view]; 
} 
+0

Esto parece algo frágil (se basa en que Apple siempre usa sus propios accesorios), pero parece que funciona. ¡Gracias! –

+1

Acepto que es un poco frágil, pero no hay nada más documentado, y es ciertamente menos frágil que acceder a ivars directamente –

+3

['- [UIViewController isViewLoaded]'] (http://stackoverflow.com/a/1076425/242933). – ma11hew28

0

Puede usar object_getIvar() para obtener el valor sin pasar por el acceso. Básicamente, le permite acceder a _view sin necesidad de crear un vínculo en su contra. Por otro lado, tiene el potencial de romperse si el ivar actual se va o se renombra. Tradicionalmente, eso nunca fue una preocupación real, pero el iPhone usa el tiempo de ejecución moderno que no sufre problemas de clase base frágiles, por lo que Apple podría sentirse más inclinado a hacer ese tipo de cambios.

66

Desde el iPhone OS 3.0, se puede utilizar el método isViewLoaded para ver si se carga una vista.

+1

¡Esta debería ser la respuesta correcta ahora! – huesforalice

+0

el enlace está roto. – Chris

+0

acaba de arreglar el enlace – Zargony

Cuestiones relacionadas