plus entre diferencias apple iphone objective-c

entre - iphone xs



SDK de iPhone: ¿cuál es la diferencia entre loadView y viewDidLoad? (7)

La forma más fácil de usar loadView es crear algún tipo de controlador de vista base, como MyBaseViewController, que es la subclase de UIViewController. En su método loadView crea la vista de esta manera:

-(void) loadView { if ([self viewFromNib]) { self.view = [self viewFromNib]; } else { self.view = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; } self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight; self.view.backgroundColor = [UIColor whiteColor]; }

Y cuando necesitas crear un controlador de vista, simplemente utilizas la subclase de MyBaseViewController y en su controlador loadView solo llamas a [super loadView] como este

//sucblass loadView -(void) loadView { [super loadView]; //rest of code like this.. UILabel *myLabel = [[UILabel alloc] initWithFrame:myFrame]; [self.view addSubview:myLabel]; [myLabel release]; }

Al trabajar con vistas y ver controladores en una aplicación de iPhone, ¿alguien puede explicar la diferencia entre loadView y viewDidLoad?

Mi contexto personal es que construyo todos mis puntos de vista a partir del código, no utilizo Interface Builder ni lo usaré, si eso marca alguna diferencia.

He encontrado que a menudo cuando agrego el código de inicio a loadView, termino con un rastro de pila infinito, así que normalmente hago todo mi desarrollo de vista de niños en viewDidLoad ... pero no está claro para mí cuando se ejecuta cada uno, y ¿Cuál es el lugar más apropiado para poner el código de inicio? Lo que sería perfecto, es un diagrama simple de las llamadas de inicialización.

¡Gracias!


Para evitar que ocurra un bucle infinito cuando lee self.view, llame a la súper implementación de la clase cuando cargue una vista. La implementación súper asignará una nueva UIView para usted.

- (void) loadView { [super loadview]; // init code here... [self.view addSubView:mySubview1]; //etc.. }


Puedo adivinar cuál podría ser el problema aquí, porque lo he hecho:

He encontrado que a menudo cuando agrego código de inicio a loadView, termino con un rastro infinito de la pila

No lea self.view en -loadView. Solo configúralo , no lo entiendas .

El acceso de propiedad self.view llama a -loadView si la vista no está cargada actualmente. Ahí está tu recursión infinita.

La forma habitual de compilar la vista mediante programación en -loadView, como se demuestra en los ejemplos de pre-Interface-Builder de Apple, es más como esto:

UIView *view = [[UIView alloc] init...]; ... [view addSubview:whatever]; [view addSubview:whatever2]; ... self.view = view; [view release];

Y no te culpo por no usar IB. Me he quedado con este método para todo Instapaper y me siento mucho más cómodo con él que lidiar con las complejidades de IB, los caprichos de la interfaz y el comportamiento inesperado detrás de escena.


Solo agregué algunos ejemplos de código para demostrar lo que dijo NilObject:

- (void)loadView { // create and configure the table view myTableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] style:UITableViewStyleGrouped]; myTableView.delegate = self; myTableView.dataSource = self; myTableView.scrollEnabled = NO; self.view = myTableView; self.view.autoresizesSubviews = YES; } - (void)viewDidLoad { self.title = @"Create group"; // Right menu bar button is to Save UIBarButtonItem *saveButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Save" style:UIBarButtonItemStyleDone target:self action:@selector(save)]; self.navigationItem.rightBarButtonItem = saveButtonItem; [saveButtonItem release]; }


loadView() cuando se le pide a su controlador que cree su self.view . Puedes hacerlo por ti mismo como

self.view = [UIView alloc] init...];

O la clase padre UIController de su controlador ya tiene un nombre de método -loadView() que inicializa su self.view en la vista en blanco. Entonces puedes llamar

[super loadView];

Realmente recomiendo el segundo enfoque, ya que alienta la herencia. Solo si su controlador de vista no se hereda directamente de UIViewController.


loadView es el método en UIViewController que realmente cargará la vista y la asignará a la propiedad de view . Esta es también la ubicación que una subclase de UIViewController anularía si quisiera establecer programáticamente la propiedad de view .

viewDidLoad es el método que se llama una vez que se ha cargado la vista. Esto se llama después de llamar a loadView. Es un lugar donde puede anular e insertar código que hace una configuración inicial adicional de la vista una vez que se ha cargado.


viewDidLoad()

debe utilizarse cuando carga su vista desde un NIB y desea realizar cualquier personalización después del lanzamiento

LoadView()

se debe usar cuando desee crear su vista mediante programación (sin el uso de Interface Builder)