2011-11-13 9 views
6

Soy nuevo en iOS5 y storyboard.iOS5: Confusión con loadview e init y variables de instancia

Noté que si declaro variables de instancia dentro de mi viewcontroller .h file y establezco los valores dentro de mi archivo init of .m de mi viewcontroller, cuando la vista del viewcontroller se muestra, mis variables de instancia muestran null dentro de viewDidLoad . Para que pueda obtener mis variables, tendré que hacer [self init] dentro de viewDidLoad. Mis preguntas son:

@interface tableViewController : UITableViewController 
{ 
NSMutableArray *myvariable; 
} 
@end 

@implementation tableViewController 
-(id)init 
{ 
myvariable = [[NSMutableArray alloc]initWithObjects:@"Hi2",@"Yo2",@"whatsup2", nil]; 
} 

- (void)viewDidLoad 
{ 
NSLog(@"%@",myvariable); // DISPLAYS NULL 
[super viewDidLoad]; 
} 
  1. ¿Por qué no es mi variables disponibles en viewDidLoad cuando declaré e implementé en mi .hy archivos .m?
  2. Si ese es el caso, ¿viewDidLoad o viewWillAppear son los lugares comunes para cargar los datos para viewcontroller?
  3. Parece que incluso cuando crea una instancia de un controlador de visualización y se llama a la función init, viewDidLoad no tiene necesariamente las variables que se mostrarán.
  4. ¿Dónde está el lugar/los métodos correctos para cargar el modelo (datos) para mi controlador de visualización?

Gracias de antemano

Respuesta

14

Así que para responder a la primera pregunta, el inicializador que se llama en este caso es initWithCoder :, no init. Entonces, si mueve su inicialización de NSArray allí a initWithCoder, debería encontrar que está disponible antes de que su vista se cargue.

No olvide que también debe llamar al inicializador de su superclase. Por lo que un patrón de esta manera funcionará:

-(id)initWithCoder:(NSCoder *)aDecoder { 

    if ((self = [super initWithCoder:aDecoder])) { 

     // initialize what you need here 
    } 

    return self; 

} 

También obtendrá awakeFromNib llamada después initWithCoder: y después de todos sus puntos de venta se han conectado, así que si su inicialización depende de los puntos de venta están pobladas, entonces hay es la oportunidad de hacer esa inicialización allí.

Y entonces por supuesto que tienen viewDidLoad y viewWillAppear:. No sé si hay una respuesta general al método "correcto" para usar (preguntas 2 y 4). Depende de la cantidad de datos que tenga, la frecuencia con que debe actualizarse y el tiempo de carga. Mi opinión es que esa es una decisión que debe tomarse para cada caso.

Para la pregunta n. ° 3, ¿tiene un ejemplo de lo que ha visto allí? El inicializador definitivamente se llamará antes de viewDidLoad. El truco es saber a qué inicializador se llama.

Tenga en cuenta que viewDidLoad se puede llamar varias veces durante la vida útil de su controlador de vista. Así que esté preparado para eso. Y, por supuesto, viewWillAppear: es aún más probable que se llame varias veces durante la vida útil de su controlador de vista.

Espero que ayude.

+0

HI Firoze, Gracias por la respuesta. initWithCoder es definitivamente la función correcta para llamar, ¿Todo viewcontroller siempre llama a initWithCoder. ¿Cuál es la diferencia entre poner mi instanciación variable en initWithCoder, initWithNibName e init?¿Eso significa que cuando hago SomeViewController * test = [[SomeViewController alloc] init] ;, también se está llamando al initWithCoder? – sonoluminescence

+0

'awakeFromNib' es un lugar mejor para tal inicialización IMO. Para responder a la pregunta, si crea un objeto a partir de un archivo de punta, use awakeFromNib, si crea un objeto en el código, use init. – Abizern

+0

Bueno, no, @sunwukong, no estoy sugiriendo que llame a initWithCoder usted mismo. El marco llamará a ese método cuando desarchive cualquier controlador de vista que tenga en su guión gráfico. Por lo tanto, si desea inicializar un controlador de vista en un guión gráfico, debe anular initWithCoder: y/o awakeFromNib. –

Cuestiones relacionadas