indexPathForCell devuelve nil desde ios7

mi aplicación funcionaba bien en ios6.1. probé el simulador ios7 y la siguiente parte no funciona:

EditingCell *cell = (EditingCell*) [[textField superview] superview]; NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; NSLog(@"the section is %d and row is %d", indexPath.section, indexPath.row); NSUInteger section = [indexPath section]; NSUInteger row = [indexPath row]; NSString *rowKey = [[keysForRows objectAtIndex: section] objectAtIndex: row]; 

Siempre viene:

 the section is 0 and row is 0 

aunque se seleccionó otra sección / fila. ¿Alguien tiene una idea de por qué esto no funciona en iOS7?

Su enfoque para encontrar la celda de vista de tabla “envolvente” de un campo de texto es frágil, porque asume una jerarquía de vista fija (que parece haber cambiado entre iOS 6 e iOS 7).

Una solución posible sería atravesar la jerarquía de vistas hasta que se encuentre la celda de la vista de tabla:

 UIView *view = textField; while (view != nil && ![view isKindOfClass:[UITableViewCell class]]) { view = [view superview]; } EditingCell *cell = (EditingCell *)view; 

Un método completamente diferente, pero de uso frecuente, es “etiquetar” el campo de texto con el número de fila:

 cell.textField.tag = indexPath.row; // in cellForRowAtIndexPath 

y luego simplemente use esa etiqueta en los métodos de delegado del campo de texto.

Encontré las células de la misma manera que tú. Ahora uso este método rápido si tengo un botón en una celda y conozco la tabla en la que estoy. Devolverá la tablavista.

 -(UITableViewCell*)GetCellFromTableView:(UITableView*)tableView Sender:(id)sender { CGPoint pos = [sender convertPoint:CGPointZero toView:tableView]; NSIndexPath *indexPath = [tableView indexPathForRowAtPoint:pos]; return [tableView cellForRowAtIndexPath:indexPath]; } 

Al experimentar este problema en iOS 11, pero no en 9 o 10, func indexPath(for cell: UITableViewCell) -> IndexPath? el func indexPath(for cell: UITableViewCell) -> IndexPath? método que utiliza la técnica que @ drexel-sharp detalla anteriormente:

 override func indexPath(for cell: UITableViewCell) -> IndexPath? { var indexPath = super.indexPath(for: cell) if indexPath == nil { // TODO: iOS 11 Bug? let point = cell.convert(CGPoint.zero, to: self) indexPath = indexPathForRow(at: point) } return indexPath }