2011-03-29 10 views
26

bien hasta hace un par de días atrás que utilizo para codificar todo para UITableViewCell enqué hacer programadores utilizan configureCell: atIndexPath: config método para la Célula tableView

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

método. Pero recientemente descubrí que los desarrolladores de iPhone (o mac) usan configureCell:atIndexPath: e incluso la mayoría de las manzanas provistas de código fuente lo tienen como una de las funciones de clase. Así que mi pregunta es básicamente por qué nos gusta crear una función más para proporcionar el contenido de la celda y luego escribir todo el código en el método cellForRowAtIndexPath: en su lugar.

PS. para las personas que no están familiarizadas con esto, entonces debería ver el código fuente de las manzanas. y configureCell:atIndexPath: no es otro método en UITableViewDatasource, es solo una función de clase que tenemos en cada clase que tiene vista de tabla. Y lo usamos así.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
             reuseIdentifier:CellIdentifier] autorelease]; 
    } 
    [self configureCell:cell atIndexPath:indexPath]; 
    return cell; 
} 

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath 
{ 
    cell.titleLabel.text = [NSString stringWithFormat:@"%d",indexPath.row]; 
} 

Y más importante, después de sólo usar este estilo para fines de prueba llegué en el amor esta función y ahora lo uso todo el tiempo (Cuando estoy usando un UITableView)

Editar:. Ok Creo que la gente se está equivocando con mi pregunta, así que déjenme aclararla.

que significaba qué crear otra función cuando se puede colocar todo el código en esta función

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

no soy preocupación por el nombre del método.

Respuesta

66

Se hace porque es posible que desee actualizar las celdas cuando ya están en la pantalla. En lugar de actualizar completamente la celda, simplemente puede buscar la celda existente desde la vista de tabla y ejecutarla a través del configureCell:atIndexPath:. Si el método se implementa correctamente, esto actualizará todos los datos en la celda sin que UITableView elimine la celda anterior, dequeue o asigne la nueva celda y la ponga en la pantalla.


Por interés histórico:

Por lo que yo sé, yo soy el tipo que es responsable de configureCell:atIndexPath:. Estoy seguro de que otras personas han tenido la misma idea, pero creo que el fragmento de código que popularizó fue originalmente escrito por mí. Luego fue difundido por Apple y se convirtió en una convención.

Las primeras versiones de NSFetchedResultsControllerDelegate tenían un método controllerDidChangeContent:, pero sin controllerWillChangeContent: llamada, que significaba que no había oportunidad de llamar -[UITableView beginUpdates] antes de cambiar el contenido de la vista de tabla.

Archivé Radar # 6708453 solicitándoles que agregaran este método de delegado, e incluí un código de ejemplo para mostrarles lo que quería hacer. Ese código tenía la lógica de actualización de la celda real en una llamada refreshCell:atIndexPath:, por lo que se podía llamar desde tableView:cellForRowAtIndexPath: y controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:. Cuando salió la siguiente semilla beta, descubrí que el equipo de ingeniería de iOS no solo agregó el método que sugerí, sino que copió el código de muestra de mi informe de errores en el NSFetchedResultsControllerDelegate documentation, aunque sabiamente cambiaron el nombre al menos confuso configureCell:atIndexPath:.

De hecho, hoy comencé un nuevo proyecto con la plantilla de Datos principales de Master/Detail iOS, y noté que mi código y el método configureCell:atIndexPath: con él estaban en la plantilla. Ejecuté una búsqueda rápida en Google para ver si se había convertido en una convención común. Parece que tiene. ¡Estoy bastante orgulloso de lo que ese pequeño pedazo de código ha hecho de sí mismo!

+0

Eso es realmente una buena pieza de fragmento de código que ha realizado. gracias por tu contribución – Robin

+5

¡Una historia genial y genial! – jpswain

+0

@Robin: probablemente deberías aceptar esta respuesta. – BoltClock

8

Probablemente porque pensamos que la personalización de las propiedades y el contenido de una celda pertenece en un procedimiento separado desde la búsqueda de una celda reutilizable hasta la eliminación de la cola y/o la creación de una nueva si no hay nada que eliminar.

6
[self configureCell:cell atIndexPath:indexPath]; 

es simplemente para que su código esté limpio y sea fácil de leer.

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath 

puede llamarlo de cualquier manera, pero la mayoría elige llamarlo de esta manera. Esto se debe a que este método consiguió pasar en el objeto UITableViewCell y el objeto indexPath entonces devolver el "configed" UITableViewCell que luego se get devuelve como un objeto de cambio de

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

en otherword, puede utilizar

- (void)configureCellXXX:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath 

y lo llaman usando

[self configureCellXXX:cell atIndexPath:indexPath]; 

y sería todavía trabajar :)

+1

buen nombre para una función 'XXX' .. – Robin

10

La única vez que he visto una ventaja real, legibilidad, es cuando tienes múltiples tipos de células. A continuación, puede tener métodos separados que sólo saben cómo llenar ese tipo particular de célula, como si tuviera 3 tipos diferentes de células, para perros, gatos y jirafas:

- (void)configureDogCell:(DogCell *)cell atIndexPath:(NSIndexPath *)indexPath 
- (void)configureCatCell:(CatCell *)cell atIndexPath:(NSIndexPath *)indexPath 
- (void)configureGiraffeCell:(GiraffeCell *)cell atIndexPath:(NSIndexPath *)indexPath 

Dicho esto, yo no uso este patrón mí mismo. Acabo de verlo utilizado por otros desarrolladores en proyectos en los que he trabajado.

Cuestiones relacionadas