2010-09-03 14 views
12

¿alguien puede explicar por qué debería usar viewWithTag para obtener subvistas (por ejemplo, UILabel, etc.) desde una celda en dequeueReusableCellWithIdentifier?¿Por qué usar "viewWithTag" con "dequeueReusableCellWithIdentifier"?

Alguna información de fondo: Tengo un UITableViewCell personalizado con un par de UILabel s en él (he reproducido una versión simple de esto a continuación). Estas etiquetas se definen en el archivo NIB asociado y se declaran con IBOutlet sy se vuelven a vincular a la clase de controlador de la celda personalizada. En el tableview de dequeueReusableCellWithIdentifier, estoy haciendo esto:

CustomCell *customCell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"CustomCellId"]; 
if (customCell == nil) { 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"customCell" owner:self options:nil]; 
    for (id oneObject in nib) 
     if ([oneObject isKindOfClass:[CustomCell class]]) 
      customCell = (CustomCell *)oneObject; 
} 

customCell.firstLabel.text = @"Hello"; 
customCell.secondLabel.text = @"World!"; 

return customCell; 

Todo funciona bien. Sin embargo a partir de los tutoriales que he visto, parece que al cambiar los valores de las etiquetas que debería estar haciendo esto en su lugar:

UILabel *firstLabel = (UILabel *)[customCell.contentView viewWithTag:555]; 
firstLabel.text = @"Hello"; 

UILabel *secondLabel = (UILabel *)[customCell.contentView viewWithTag:556]; 
secondLabel.text = @"World!"; 

(de las etiquetas valores de las variables se han establecido en el NIB).

¿Puede alguien decirme qué método prefiere y por qué?

Gracias!

Respuesta

10

Me he dado cuenta de que es útil recuperar elementos usando "viewWithTag" si los elementos se agregaron a la celda mediante programación (es decir, no definidos en un NIB y conectados mediante IBOutlets); creado para cada instancia de la celda.

+1

Normalmente debe usar una subclase UITableViewCell sobre el método viewWithTag rápido y sucio. –

1

Siempre engancho las subvistas a las propiedades de mi subclase UITableViewCell a través de IBOutlets, como lo ha hecho. No puedo pensar en ninguna buena razón para usar viewWithTag.

13

viewWithTag: es una manera rápida y sucia de sacar vistas secundarias sin tener que configurar las propiedades IBOutlet en el elemento principal, o incluso sin tener que crear una subclase UITableViewCell.

Para casos muy simples esta es una solución aceptable, para eso se diseñó viewWithTag:. Sin embargo, si vas a reutilizar mucho esa celda o quieres que tenga una interfaz más amigable para el desarrollador, querrás crear una subclase y usar propiedades reales como en tu primer ejemplo.

Así que use viewWithTag: si es una celda muy simple que diseñó en IB sin subclase y con solo un par de etiquetas. Use una subclase de celda con propiedades reales para algo más sustancial.

4

Para mí, viewWithTag es un regalo de Dios. En primer lugar: tratar todas las vistas en un bucle como Taskinoor dijo que es realmente fácil. Además, personalmente prefiero de esta manera porque si echo un vistazo al código y quiero ver qué sucede con una vista, simplemente busco la etiqueta. Se usa en todas partes donde se maneja la vista. Opuesto al enfoque xib donde debes buscar en el código y xib también. Además, si tiene una vista fuera de pantalla en un xib, puede supervisarlo. Encontré muchas xibs hechas por otros programadores que estaban LLENAS con muchas y muchas vistas. Algunos ocultos, otros fuera de pantalla, no podían decir cuál es cuál, ya que todos se superponen. En esos casos, creo que los xib son malos. Ya no son fáciles de leer. Prefiero todo hecho en código.

Pero si decides trabajar con etiquetas, recuerda evitar codificar cualquier etiqueta. En su lugar, haga una lista de definiciones #define para mantener el código limpio y legible.

0

De UITableViewCell Referencia de clase: "El delegado de la vista de tabla en tableView: cellForRowAtIndexPath: siempre debe restablecer todo el contenido al reutilizar una celda." Mantenlo simple, borra la vista de contenido. Esto no hace suposiciones acerca de las clases de células a medida, no hay moldes, ninguna inspección clase:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId]; 
if (cell != nil) 
{ 
    NSArray* contentSubViews = [cell.contentView subviews]; 
    for (UIView* viewToRemove in contentSubViews) 
    { 
     [viewToRemove removeFromSuperview]; 
    } 
} 
0

viewWithTag: permite labrar sin crear una subclase personalizada deUITableViewCell.

Se puede asignar un identificador de la etiqueta y la reutilización de un prototipo UITableViewCell en Interface Builder, a continuación, quitar de la cola y modificar la vista con esa etiqueta dentro de la implementación de su UITableViewController, sin crear una clase personalizada para esa célula o la creación de IBOutlets para la célula de subvistas.

En algunos casos, la simplicidad de una celda hace que una clase personalizada parezca exagerada. viewWithTag: le permite agregar texto e imagen personalizados a una celda en el Guión gráfico, luego establecer esas personalizaciones a través de código, sin agregar archivos de clase adicionales a su proyecto de Xcode.