¿Cómo funciona cellForRowAtIndexPath?

HE LEÍDO la documentación de Apple y no es comprensible para un principiante tan principiante en Objective-C como yo. Estoy tratando de implementar UITableView siguiendo este ejemplo de enlace y simplemente no funciona, así que cellForRowAtIndexPath que comprender cómo funciona cellForRowAtIndexPath , porque a mí personalmente este método me parece bastante complicado.

1) ¿Qué devuelve? UITableViewCell ? Pero, ¿por qué se ve tan extraño?

 -(UITableViewCell *)tableView:(UITableView *)tableView 
  • ¿Que es eso? ¿Podría explicar por favor?

2) ¿Cómo se llama y qué es más importante cómo puedo conectarlo a cierto UITableView ? ¿Qué pasa si tengo dos UITableView llamados firstTableView y secondTableView y quiero que sean diferentes (para realizar cellForRowAtIndexPath diferente)? Cómo se supone que UITableViews vincular mis UITableViews a este

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

el método acepta NSIndexPath , no UITableView . ¿Qué voy a hacer?

1) La función devuelve una celda para una vista de tabla ¿sí? Entonces, el objeto devuelto es del tipo UITableViewCell . Estos son los objetos que ves en las filas de la tabla. Esta función básicamente devuelve una celda, para una vista de tabla. Pero podría preguntar cómo la función sabría qué celda devolver para qué fila, lo cual se responde en la segunda pregunta.

2) NSIndexPath es esencialmente dos cosas-

  • Su sección
  • Tu fila

Debido a que su tabla puede dividirse en muchas secciones y cada una con sus propias filas, este NSIndexPath lo ayudará a identificar con precisión qué sección y qué fila. Ambos son enteros. Si eres un principiante, yo diría que lo intentes con solo una sección.

Se llama si implementa el protocolo UITableViewDataSource en su controlador de vista. Una forma más simple sería agregar una clase UITableViewController . Recomiendo esto porque Apple tiene un código escrito para que implemente fácilmente las funciones que pueden describir una tabla. De todos modos, si elige implementar este protocolo usted mismo, necesita crear un objeto UITableViewCell y devolverlo para cualquier fila. Eche un vistazo a su referencia de clase para comprender re-usablity porque las celdas que se muestran en la vista de tabla se reutilizan una y otra vez (este es un diseño muy eficiente por cierto).

En cuanto a cuando tienes dos vistas de tabla, mira el método. La vista de tabla se le pasa, por lo que no debería tener un problema con respecto a eso.

Trataré de descomponerlo (ejemplo de documention )

 /* * The cellForRowAtIndexPath takes for argument the tableView (so if the same object * is delegate for several tableViews it can identify which one is asking for a cell), * and an indexPath which determines which row and section the cell is returned for. */ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { /* * This is an important bit, it asks the table view if it has any available cells * already created which it is not using (if they are offScreen), so that it can * reuse them (saving the time of alloc/init/load from xib a new cell ). * The identifier is there to differentiate between different types of cells * (you can display different types of cells in the same table view) */ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"]; /* * If the cell is nil it means no cell was available for reuse and that we should * create a new one. */ if (cell == nil) { /* * Actually create a new cell (with an identifier so that it can be dequeued). */ cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MyIdentifier"] autorelease]; cell.selectionStyle = UITableViewCellSelectionStyleNone; } /* * Now that we have a cell we can configure it to display the data corresponding to * this row/section */ NSDictionary *item = (NSDictionary *)[self.content objectAtIndex:indexPath.row]; cell.textLabel.text = [item objectForKey:@"mainTitleKey"]; cell.detailTextLabel.text = [item objectForKey:@"secondaryTitleKey"]; NSString *path = [[NSBundle mainBundle] pathForResource:[item objectForKey:@"imageKey"] ofType:@"png"]; UIImage *theImage = [UIImage imageWithContentsOfFile:path]; cell.imageView.image = theImage; /* Now that the cell is configured we return it to the table view so that it can display it */ return cell; } 

Este es un método de DataSource por lo que se UITableView sobre el objeto que se haya declarado como DataSource de UITableView . Se invoca cuando la vista de tabla realmente necesita mostrar la celda en pantalla, según el número de filas y secciones (que especifique en otros métodos de DataSource).

Básicamente está diseñando su celda. Se llama a Cellforrowatindexpath para cada celda y el número de celda se encuentra por indexpath.row y el número de sección por indexpath.section. Aquí puede usar una etiqueta, un botón o una imagen con texto que desee y que se actualice para todas las filas de la tabla. Respuesta para la segunda pregunta En la celda de la fila en la ruta del índice use una statement if

En el objective C

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *CellIdentifier = @"CellIdentifier"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if(tableView == firstTableView) { //code for first table view [cell.contentView addSubview: someView]; } if(tableview == secondTableView) { //code for secondTableView [cell.contentView addSubview: someView]; } return cell; } 

En Swift 3.0

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell:UITableViewCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as UITableViewCell! if(tableView == firstTableView) { //code for first table view } if(tableview == secondTableView) { //code for secondTableView } return cell }