Cuando uso registerNib:forCellReuseIdentifier, ¿cómo inicio UITableViewCell iVars?

Estoy cargando subclases personalizadas UITableViewCells de punta.

Mi controlador de vista viewDidLoad usos del método registerNib:forCellReuseIdentifier. Mi controlador de vista cellForRowAtIndexPath usos del método dequeueReusableCellWithIdentifier para cargar la celda, pero nunca asigno/inicio la celda.

Controlador de vista:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.tV registerNib:[UINib nibWithNibName:@"VersatileIntTFCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:kTFInt];
    self.tV.delegate=self;
    self.tV.dataSource=self;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Int TextField";
    VersatileIntTFCell *cell = (VersatileIntTFCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];   
    return cell;

}

La vista de tabla se ve bien y las celdas se ven bien.

Ahora, estoy empezando a escribir las subclases de UITableViewCell. Cada una de mis subclases tiene algunos @property iVars (no son IBOutlets). Me gustaría iniciar estos en el init método de la UITableViewCell subclase, pero eso no parece ser llamado nunca. Puedo iniciarlos en viewController's cellForRowAtIndexPath pero quiero evitar esto. quiero hacerlo en el UITableViewCell subclase. es posible? Si es así, ¿cómo/dónde/cuándo?

preguntado el 08 de septiembre de 12 a las 09:09

3 Respuestas

Anular el awakeFromNib método y coloque su código allí en lugar de en el archivo init.

De los documentos:

La infraestructura de carga de nib envía un mensaje wakeFromNib a cada objeto recreado a partir de un archivo de nib, pero solo después de que todos los objetos del archivo se hayan cargado e inicializado. Cuando un objeto recibe un mensaje wakeFromNib, se garantiza que ya se han establecido todas sus conexiones de salida y acción. Debe llamar a la súper implementación de wakeFromNib para dar a las clases principales la oportunidad de realizar cualquier inicialización adicional que requieran.

Respondido el 28 de enero de 13 a las 21:01

Si desea inicializar cualquier UIView después de cargarlo desde una punta, debe anular initWithCoder. awakeFromNib también podría ser útil. Consulte 'Métodos para anular' en la referencia de UIView.

Respondido el 26 de Septiembre de 12 a las 16:09

Esto debe marcarse como la respuesta aceptada. wakeFromNib es la función a usar y no initWithCoder ya que las subvistas no se han cargado hasta que realmente se necesitan. Sin embargo, están cargados en wakeFromNib. - acatyyc

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.