¿Cómo puedo saber si actualmente existe un UITableViewCell?

Dado el indexPath de una UITableViewCell, quiero saber si la celda existe actualmente.

Sé cómo verificar si está en la pantalla (use tableView.indexPathsForVisibleRows ). Sin embargo, también quiero saber si está fuera de la pantalla pero que ya se creó (suponiendo que el usuario haya realizado un desplazamiento, pero todavía no ha entrado completamente en la pantalla).

¿Cómo hago esto?

Si está reutilizando celdas por dequeueReusableCellWithIdentifier: la tablaView funcionará como un protractor. La celda que se ha desplazado fuera de la pantalla transferirá inmediatamente a la celda que entrará en la pantalla. Teóricamente, tableView no creará más células que una pantalla para usted. Por lo tanto, no tiene sentido que quieras saber sobre la celda de la pantalla.

UITableViewCell es solo una vista según MVC Pattern . Es su model, sus datos, que deciden qué debe estar presente en una celda específica en un índice de ruta específico. Su código probablemente sea así:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // dequeue a cell // ... if (!cell) { // init a cell // ... } // for a given indexPath, decide what should be presented in the cell, something like updating the cell's properties cell.textLabel.text = [self.data dataShouldBePresentedAtIndexPath:indexPath]; } 

Tu puedes hacer

 [self.tableView cellForRowAtIndexPath:indexPath]; 

(no se debe confundir con el método fuente de datos [self tableView:cellForRowAtIndexPath:] ) y si existe una celda para esa ruta de índice, se devolverá. De lo contrario, obtendrás nil .

Definitivamente no quiere que su process de actualización de background mantenga una reference directa a la celda porque, como usted dijo, puede haberse desplazado fuera de la pantalla y haber sido reciclado para cuando finalice la extracción. En su lugar, mantenga una reference a la ruta del índice o algún dato que pueda usarse para search la ruta del índice y luego use esa ruta del índice con el método anterior para recuperar la celda.

Las únicas celdas que existen son las que están actualmente visibles. Tan pronto como la celda se desplaza fuera de la vista, el object de celda se pone a disposition del método dequeueReusableCellWithIdentifier de dequeueReusableCellWithIdentifier , que es la forma en que el sistema operativo conserva la memory cuando se trata de cantidades masivas de datos de tabla para mostrar en una cantidad tan pequeña de bienes inmuebles.

Si desea realizar un seguimiento de qué celdas ya se han visto, debe modificar los objects subyacentes para tener algún tipo de BOOL o valor establecido cuando los datos del object se envían a una celda de vista de tabla en el método " cellForRowAtIndexPath: " de su aplicación.

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // dequeue a cell // ... if (cell == nill) { // init a cell // ... } // for a given indexPath, decide what should be presented in the cell, something like updating the cell's properties cell.textLabel.text = [self.data dataShouldBePresentedAtIndexPath:indexPath]; } 

puedes verificar si la celda existe o no … espero que esto funcione … 🙂

Alternativamente puedes hacer algo como esto

 -(BOOL) isRowPresentInTableView:(int)row withSection:(int)section { if(section < [self.tableView numberOfSections]) { if(row < [self.tableView numberOfRowsInSection:section]) { return YES; } } return NO; } 

En Swift 3

 let YOURINDEXPATH = IndexPath(row: 4, section: 0) if tableView.cellForRow(at: YOURINDEXPATH) != nil { // DO YOUR STUFFS HERE } 

defina su ruta de índice (YOURINDEXPATH) en consecuencia