uitableviewcell custom create objective-c uitableview

objective c - custom - ¿Es posible actualizar una sola UITableViewCell en una UITableView?



uitableview custom cell (8)

Tengo una UITableView personalizada utilizando UITableViewCell s. Cada UITableViewCell tiene 2 botones. Al hacer clic en estos botones, se cambiará una imagen en UIImageView dentro de la celda.

¿Es posible actualizar cada celda por separado para mostrar la nueva imagen? Cualquier ayuda es apreciada.


Intenté simplemente llamar -[UITableView cellForRowAtIndexPath:] , pero eso no funcionó. Pero, el siguiente funciona para mí, por ejemplo. alloc y alloc el NSArray para una administración de memoria ajustada.

- (void)reloadRow0Section0 { NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil]; [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone]; [indexPaths release]; }


Necesito la celda de actualización, pero quiero cerrar el teclado. Si uso

let indexPath = NSIndexPath(forRow: path, inSection: 1) tableView.beginUpdates() tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations tableView.endUpdates()

el teclado desaparece


Para actualizar estas respuestas ligeramente con la nueva sintaxis literal en iOS 6, puede usar Paths = @ [indexPath] para un solo objeto, o Paths = @ [indexPath1, indexPath2, ...] para múltiples objetos.

Personalmente, he encontrado que la sintaxis literal para matrices y diccionarios es inmensamente útil y ahorra mucho tiempo. Para empezar, es más fácil de leer. Y elimina la necesidad de un cero al final de cualquier lista de objetos múltiples, que siempre ha sido un problema personal. Todos tenemos nuestros molinos de viento para inclinar, ¿sí? ;-)

Solo pensé en tirar esto en la mezcla. Espero eso ayude.


Rápido:

func updateCell(path:Int){ let indexPath = NSIndexPath(forRow: path, inSection: 1) tableView.beginUpdates() tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations tableView.endUpdates() }


Si está utilizando TableViewCells personalizados, el genérico

[self.tableView reloadData];

no responde eficazmente esta pregunta a menos que abandone la vista actual y regrese. Tampoco la primera respuesta.

Para volver a cargar con éxito su primera celda de vista de tabla sin cambiar de vista , use el siguiente código:

//For iOS 5 and later - (void)reloadTopCell { NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil]; [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone]; }

Inserte el siguiente método de actualización que llama al método anterior para que pueda volver a cargar personalizado solo la celda superior (o la vista de tabla completa si lo desea):

- (void)refresh:(UIRefreshControl *)refreshControl { //call to the method which will perform the function [self reloadTopCell]; //finish refreshing [refreshControl endRefreshing]; }

Ahora que tiene eso ordenado, dentro de su viewDidLoad agregue lo siguiente:

//refresh table view UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; [refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged]; [self.tableView addSubview:refreshControl];

Ahora tiene una función de tabla de actualización personalizada que volverá a cargar la celda superior. Para volver a cargar toda la tabla, agregue el

[self.tableView reloadData]; a su nuevo método de actualización.

Si desea volver a cargar los datos cada vez que cambie de vista, implemente el método:

//ensure that it reloads the table view data when switching to this view - (void) viewWillAppear:(BOOL)animated { [self.tableView reloadData]; }


Swift 3:

tableView.beginUpdates() tableView.reloadRows(at: [indexPath], with: .automatic) tableView.endUpdates()


Una vez que tenga el indexPath de su celda, puede hacer algo como:

[self.tableView beginUpdates]; [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPathOfYourCell, nil] withRowAnimation:UITableViewRowAnimationNone]; [self.tableView endUpdates];

En Xcode 4.6 y superior:

[self.tableView beginUpdates]; [self.tableView reloadRowsAtIndexPaths:@[indexPathOfYourCell] withRowAnimation:UITableViewRowAnimationNone]; [self.tableView endUpdates];

Puedes establecer lo que quieras como efecto de animación, por supuesto.


reloadRowsAtIndexPaths: está bien, pero aún obligará a los métodos de UITableViewDelegate a dispararse.

El enfoque más simple que puedo imaginar es:

UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath]; [self configureCell:cell forIndexPath:indexPath];

Es importante invocar su configureCell: implementación en el hilo principal, ya que no funcionará en el hilo que no sea UI (la misma historia con reloadData / reloadRowsAtIndexPaths: . A veces puede ser útil agregar:

dispatch_async(dispatch_get_main_queue(), ^ { [self configureCell:cell forIndexPath:indexPath]; });

También vale la pena evitar el trabajo que se haría fuera de la vista visible actualmente:

BOOL cellIsVisible = [[self.tableView indexPathsForVisibleRows] indexOfObject:indexPath] != NSNotFound; if (cellIsVisible) { .... }