La aplicación se bloquea al llamar a 'tableView endUpdates'

Actualmente estoy trabajando en la implementación de un selector UIDate en línea dentro de una UITableViewCell.

Soy capaz de mostrar y ocultar esta celda selectora cuando selecciono la celda directamente encima de donde se debe insert esa celda, que es el comportamiento que espero. Sin embargo, la aplicación se bloquea si selecciono otras celdas en la vista de tabla:

*** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-3318.16.14/UITableView.m:1582 

Después de ver la respuesta aceptada a esta pregunta de SO , agregué un punto de interrupción de exception y descubrí que la aplicación se bloquea en la llamada a [tableView endUpdates]; en didSelectRowAtIndexPath :

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; // Check to see if the "Only Alert From" row was selected. The cell with the picker should be below this one. if (indexPath.section == TimeOfDaySection && indexPath.row == HourTimeZoneRow && self.timePickerIsShowing == NO){ [tableView beginUpdates]; [self showTimePicker]; [tableView endUpdates]; } else{ [tableView beginUpdates]; [self hideTimePicker]; [tableView endUpdates]; [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; } [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; } 

Dicho esto, no estoy seguro de cómo proceder. Si comento la llamada a [tableView endUpdates]; , la aplicación no se bloqueará cuando se selectn otras celdas, PERO la celda con la vista del selector no se ocultará. ¿Alguien tiene alguna sugerencia? ¡Gracias!

EDIT: A continuación se muestra mi código para showTimePicker y hideTimePicker :

 - (void)showTimePicker { self.timePickerIsShowing = YES; self.timePicker.hidden = NO; //Create the index path where we insert the cell with the picker NSIndexPath *indexPath = [NSIndexPath indexPathForRow:HourTimeZoneRow + 1 inSection:TimeOfDaySection]; [self.tableView beginUpdates]; [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; [self.tableView endUpdates]; self.timePicker.alpha = 0.0f; [UIView animateWithDuration:0.25 animations:^{ self.timePicker.alpha = 1.0f; //This is the row where the picker cell should be inserted [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:HourTimeZoneRow + 1 inSection:TimeOfDaySection]] withRowAnimation:UITableViewRowAnimationFade]; [self.tableView reloadData]; }]; } - (void)hideTimePicker { self.timePickerIsShowing = NO; self.timePicker.hidden = YES; //Create the index path where we delete the cell with the picker NSIndexPath *indexPath = [NSIndexPath indexPathForRow:HourTimeZoneRow + 1 inSection:TimeOfDaySection]; [self.tableView beginUpdates]; //Delete the picker row [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; [self.tableView endUpdates]; [UIView animateWithDuration:0.25 animations:^{ self.timePicker.alpha = 0.0f; } completion:^(BOOL finished){ self.timePicker.hidden = YES; }]; } 

EDIT 2: Después de leer este hilo SO , creo que el problema puede ser con mi método numberOfRowsInSection :

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { switch (section) { case NotificationsSection: return TotalPreferencesRows; break; case RedZoneSection: return TotalRedZoneRows; break; case TimeOfDaySection: if (self.timePickerIsShowing) { return TotalTimeOfDayRows + 1; } // else if (self.timePickerIsShowing == NO){ // return TotalTimeOfDayRows; // } else{ return TotalTimeOfDayRows; } return TotalTimeOfDayRows; break; default: return 0; break; } } 

El problema está en su método didSelectRowAtIndexPath, que llama al método hide aunque no se muestre. Haga la cláusula else en else if , así:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; // Check to see if the "Only Alert From" row was selected. The cell with the picker should be below this one. if (indexPath.section == TimeOfDaySection && indexPath.row == HourTimeZoneRow && self.timePickerIsShowing == NO){ [tableView beginUpdates]; [self showTimePicker]; [tableView endUpdates]; } else if (indexPath.section == TimeOfDaySection && indexPath.row == HourTimeZoneRow && self.timePickerIsShowing == YES){ [tableView beginUpdates]; [self hideTimePicker]; [tableView endUpdates]; [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; } [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; } 

No estoy seguro de si este es el origen del locking, pero no se recomienda llamar a beginUpdates varias veces que estás haciendo
[tableView beginUpdates]; [self showTimePicker]; [tableView endUpdates]; porque showTimePicker llama [self.tableView beginUpdates];