2011-06-13 16 views
6

Tengo una subclase UIViewController y estoy tratando de averiguar qué anular, de modo que pueda ejecutar un código de inicialización solo una vez por instancia de objeto.Dónde inicializar algo UNA VEZ en un UIViewController

El método viewDidLoad puede parecer la respuesta obvia, pero el problema es que viewDidLoad puede ejecutarse más de una vez si el controlador restablece la vista debido a una advertencia de memoria. Los métodos initWithNibName:bundle:, init y initWithCoder: también parecen buenas opciones, pero ¿cuáles para anular? El método awakeFromNib es otra consideración, pero parece que no se ejecuta en mi controlador de vista.

¿Hay alguna manera de hacer esto que me falta?

Respuesta

4

Probablemente aún pueda usar viewDidLoad, pero en su interior utilice un booleano estático para ver si ya ha estado allí.

static BOOL didInitialize = NO; 
if (didInitialize == YES) 
    return; 

didInitialize = YES; 
/* initialize my stuff */ 
+0

Creo que mi pregunta no estaba clara. Quise decir mis instancias de objeto, pero supongo que el mismo enfoque podría ser usado con una variable de objeto. – chris

2

¿Qué hay de +(void)initialize? Es un iniciador de clase que iOS llama para ti, una vez, para la clase, según tengo entendido.

+0

Recuerda marcar 'if (self == [MyViewController class])'. –

+0

¿Se llama a + (void) initialize cuando el objeto se desempaqueta desde el plumín? Si no, la inicialización requerida puede no ocurrir correctamente. –

+0

Si se carga desde un plumín, puede implementar '- (void) awakeFromNib' para realizar una configuración única para el objeto reconstituido. Pero esto no es inicialización de clase; esto es por instancia de una configuración de una sola vez objeto de punta. Diferente. –

5

inicializador designado de UIViewControllers, el método que se supone que todos los demás inicializadores para llamar, es -initWithNibName:bundle:. Si desea inicializar algo cuando se crea su controlador de vista, anule ese método.

-viewDidLoad es para cualquier configuración que dependa de las vistas del controlador. Como usted señala, ese método puede ejecutarse más de una vez porque las vistas pueden cargarse más de una vez. -awakeFromNib no ayudará a menos que tu controlador de vista exista en una plumilla, y aun así solo tiene sentido si lo que estás inicializando depende de otros objetos en esa misma punta.

+0

Si no me equivoco, '-initWithFrame:' ​​no es un método de UIViewController, así que no creo que funcione. Quizás quiso decir 'initWithNibName: bundle:'? – chris

+0

Doh. Tienes razón, por supuesto ... Estaba pensando en UIView, no en UIViewController. Arreglaré la publicación. – Caleb

+0

Esta respuesta es correcta. Solo un método init debe ejecutar su código de inicialización, y los otros métodos init deben llamar a ese método init. –

Cuestiones relacionadas