Control de reorder de UITableViewCell desaparece cuando se desplaza la tabla

Mi UITableView tiene 2 celdas personalizadas: cell1 y cell2

Mi UITableView muestra uno u otro dependiendo de un valor de enumeración.

Si enumValue == 0, se muestra cell1 y la tabla no debe permitir el reorderamiento si enumValue> 0, se muestra cell2 y la tabla debería permitir el reorderamiento

Todo eso está funcionando bien. Los controles de reorder se muestran correctamente a medida que cambian los valores de enumeración.

Mi problema : cuando los controles de reorder aparecen en la celda, desaparecerán cuando la fila se desplace fuera de la vista. ¿Por qué está pasando esto?

Perdón por el formatting y el código bruto. No tuve problemas con el sitio. ¿Algo obvio se destaca que podría estar causando esto?

> // enum > > -(void)setScorePhase:(phase)scorePhase { > > _scorePhase = scorePhase; > > if (scorePhase > score) { > self.btnPrevious.hidden = NO; > [self.tableCorps setEditing:YES animated:YES]; > } else { > self.btnPrevious.hidden = YES; > [self.tableCorps setEditing:NO animated:YES]; > } > > switch (scorePhase) { > case score: > self.lblInstructions.text = @"Give your scores"; > self.btnNext.titleLabel.text = @"Next"; > break; > case bestdrums: > self.lblInstructions.text = @"Order the corps by best percussion"; > self.btnNext.titleLabel.text = @"Next"; > break; > case besthornline: > self.lblInstructions.text = @"Order the corps by best hornline"; > self.btnNext.titleLabel.text = @"Next"; > break; > case bestguard: > self.lblInstructions.text = @"Order the corps by best colorguard"; > self.btnNext.titleLabel.text = @"Next"; > break; > case loudesthornline: > self.lblInstructions.text = @"Order the corps by loudest hornline"; > self.btnNext.titleLabel.text = @"Next"; > break; > case favorite: > self.lblInstructions.text = @"Order the corps by your favorite"; > self.btnNext.titleLabel.text = @"Submit"; > break; > > default: > self.lblInstructions.text = @"Error"; > break; > } > [self.tableCorps reloadData]; } > -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { > > return 2; > } > > -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { > > switch (section) { > case 0: return @"World Class"; > case 1: return @"Open Class"; > default: return @"Error"; > } > } > > - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { > > if ([self.arrayOfPerformingCorps count]) { > switch (section) { > case 0: return [self.arrayOfWorldClass count]; > case 1: return [self.arrayOfOpenClass count]; > default: return 0; > } > } else { > return 0; > } > } > > -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { > > UITableViewCell *cell; > if (self.scorePhase == score) { > cell = [self.tableCorps dequeueReusableCellWithIdentifier:@"cell1"]; >cell.showsReorderControl = NO; > > } else { > cell = [self.tableCorps dequeueReusableCellWithIdentifier:@"cell2"]; >cell.showsReorderControl = YES; > > } > > > PFObject *corps; > if ([self.arrayOfPerformingCorps count]) { > if ((int)[indexPath section] == 0) { > corps = [self.arrayOfWorldClass objectAtIndex:[indexPath row]]; > } else { > corps = [self.arrayOfOpenClass objectAtIndex:[indexPath row]]; > } > > UILabel *corpsNameLabel = (UILabel *)[cell viewWithTag:0]; > corpsNameLabel.text = corps[@"corpsName"]; > > > } else { > //cell.textLabel.text = @""; > //cell.detailTextLabel.text = @""; > } > > return cell; > } > > #pragma mark - Table Reordering > - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { > if (self.scorePhase > score) return YES; > else return NO; > } > - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { > return UITableViewCellEditingStyleNone; > } > - (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath { > return NO; > } > - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { > return YES; > } > - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath > toIndexPath:(NSIndexPath *)destinationIndexPath{ > > } > > - (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath > *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath > { > if (sourceIndexPath.section != proposedDestinationIndexPath.section) { > NSInteger row = 0; > if (sourceIndexPath.section < proposedDestinationIndexPath.section) { > row = [tableView numberOfRowsInSection:sourceIndexPath.section] - 1; > } > return [NSIndexPath indexPathForRow:row inSection:sourceIndexPath.section]; > } > > return proposedDestinationIndexPath; > } 

Este es un error de iOS 8. Una solución simple es anular prepareForReuse en la subclass UITableViewCell así:

 - (void)prepareForReuse { [super prepareForReuse]; [self setEditing:NO animated:NO]; } 

Tuve el mismo problema en una vista de tabla en la que tenía celdas reorderables en una celda no reorderable. Probé algunas soluciones (diferentes identificadores reutilizables, …) la solución que encontré fue establecer la propiedad showsReorderControl en YES en mi setter.

 self.showsReorderControl = reorderable; [self setEditing:reorderable animated:NO]; 

Espero que ayude

Me enfrento al mismo problema con la versión beta de iOS 8.

Me di count cuando la tabla está en modo de edición hay dos vistas que son parte de UITableViewCell que son responsables de la edición de la tabla; estos son, UITableViewCellEditControl y UITableViewCellReorderControl. Ambas vistas están presentes cuando se crea la primera tabla y todo funciona bien, pero a medida que la tabla se vuelve a cargar / desplazar, estas vistas desaparecen.

Creo que este problema es con la versión Beta, lo probé con la versión Beta 8 de iOS 8 y el problema aún persiste.

Es posible que tengamos que esperar a la próxima versión.

He estado teniendo el mismo problema … IOS 8 beta 2.

He descubierto que el problema está en algún lugar del área "dequeueReusableCellWithIdentifier" de la celda. Tan pronto como las celdas se desplazan y usa una celda reutilizable, todas las imágenes de borrado y desplazamiento desaparecen.

Como una solución (este código todavía está en testing), saqué el código para reutilizar y registrar celdas …

 tableViewFromNib.registerClass(myViewControllerCell.self, forCellReuseIdentifier: cellReuseID) . . let cell = tableView!.dequeueReusableCellWithIdentifier(cellReuseID, forIndexPath: indexPath) as myViewControllerCell 

y lo reemplazó por esto (en cellForRowAtIndexPath) …..

 let cell = UITableViewCell() 

… todo funciona. Sé que no es una solución real (muchas celdas sin usar que vuelan alnetworkingedor), pero me ha pasado el problema para una mayor encoding. Volveré y agregaré el código dequeque más tarde cuando se solucione el problema.

PD … esto probablemente podría haber sido un comentario, pero acabo de comenzar stackoverflow y no tengo suficientes puntos para comentar.

No tenga suficientes puntos de reputación para comentar directamente en una publicación, pero me he encontrado con un problema relacionado en iOS 10 que la solución de Vadim Yelagin resuelve.

Si una subclass UITableViewCell está en estado de edición y muestra tanto un control de reorderamiento Y un button de detalle (circundado por i), por ejemplo, UITableViewCellAccessoryDetailDisclosureButton, el button de detalle aparecerá en dos lugares cuando se reutiliza: 1) Se espera un lugar en la mano derecha lado de la celda y 2) En la esquina superior izquierda de la celda.

Al tocar cualquiera de estos dos botones, se llama correctamente al método accessoryButtonTapped: pero, naturalmente, solo se necesita un button. 🙂

Anular prepareForReuse como Vadim Yelagin propuso resuelve esto también.

iOS 8 versión beta. No es un problema con el código.

Solo asegúrate de que ustedes no desperdicien 6 horas de debugging como yo … Configuro un mal layout que hace que el control de reorder fuera de la pantalla de visualización (como lo que encontré aquí ). Así que asegúrate de que tu layout automático no interrumpa tu aplicación