2011-02-02 14 views
5

Me encontré con algo que no había visto antes y pensé que podría preguntar aquí para verificar la causa. Tengo un UIController cuya vista está definida programáticamente, hoy noté que cuando comencé a comentar el código de su loadView (para probar algo más), tanto loadView como viewDidLoad fueron llamados cuatro veces. Mi opinión es que, debido a que no he configurado la propiedad view, iOS está intentando varias veces cargar la vista, aunque todavía tengo curiosidad de que este sea el caso por el que también se haya llamado a viewDidLoad.loadView llamado varias veces cuando la propiedad view no está configurada?

- (void)loadView { 
    NSLog(@"%s", __PRETTY_FUNCTION__); 

    // MAP VIEW 
    // MKMapView *tempMapView = [[MKMapView alloc] init]; 
    // [tempMapView setDelegate:self]; 
    // [self setView:tempMapView]; 
    // [self setCustomMapView:tempMapView]; 
    // [tempMapView release]; 
} 

salida de la consola:

2011-02-02 14:10:00.194 Xrails[19501:307] -[MapController loadView] 
2011-02-02 14:10:00.209 Xrails[19501:307] -[MapController viewDidLoad] 

2011-02-02 14:10:00.212 Xrails[19501:307] -[MapController loadView] 
2011-02-02 14:10:00.226 Xrails[19501:307] -[MapController viewDidLoad] 

2011-02-02 14:10:00.229 Xrails[19501:307] -[MapController loadView] 
2011-02-02 14:10:00.243 Xrails[19501:307] -[MapController viewDidLoad] 

2011-02-02 14:10:00.246 Xrails[19501:307] -[MapController loadView] 
2011-02-02 14:10:00.259 Xrails[19501:307] -[MapController viewDidLoad] 
+0

También me registro propio en el que loadView para asegurarse de que las personas son en realidad proviene de la misma MapController – nduplessis

Respuesta

1

Creo que hay dos puntos aquí. En primer lugar, creo que su suposición es correcta en el sentido de que lo que sea que llame para que la vista se vuelva nula, por lo que solicita la vista del controlador de la vista nuevamente. Esto hace que pase por -loadView como se documentó para -view en el documentation for UIViewController.

En cuanto a por qué -viewDidLoad se invoca después, aunque no ha cargado la vista; Imagino que cuando se llama al -loadView, se supone que la vista se ha cargado y llama al -viewDidLoad inmediatamente después.

De cualquier manera, si implementa -loadView usted mismo, debe tener una vista válida al final de la misma.

2

Ponga su código en viewDidLoad y comentar método loadView

+0

Cuando descomenta el código funciona bien, solo tenía curiosidad por saber qué estaba pasando. loadView parece ser el lugar correcto para crear los elementos de vista ya que no estoy usando un * .xib – fuzzygoat

+0

El acceso a la propiedad self.view llama a -loadView si la vista no está cargada actualmente. Puede haber una repetición infinita. – iHS

9

Agregar [súper loadView] al principio del método loadView

+0

Gracias. loadView fue llamado 8 veces y 3 veces cuando salí de la vista a través de un controlador de navegación. Ahora todo está bien. – tazboy

+7

de acuerdo con la documentación que no debe llamar '[super loadView]' – user102008

+0

La documentación dice que no llame a loadView directamente. No dijo no llame a super.loadView. – Boon

1

Su anulación de loadView debe asignar un objeto de self.view.

- (void)loadView 
{ 
    self.view = [UIView new]; 
} 

por documentos en https://developer.apple.com/documentation/uikit/uiviewcontroller/1621454-loadview

puede anular este método con el fin de crear sus puntos de vista de forma manual. Si elige hacerlo, asigne la vista raíz de su jerarquía de vistas a la propiedad view . Las vistas que cree deben ser instancias únicas y no deben compartirse con ningún otro objeto controlador de vista. Su implementación personalizada de este método no debe llamar súper.

Es de suponer que hay varios lugares en el fondo de UIKit donde algo como esto se llama:

if (viewController.view == nil) { 
    [viewController loadView]; 
} 
Cuestiones relacionadas