Mantener la selección al actualizar UITableView a través de reloadData

Estoy intentando implementar una vista similar a la de la aplicación de calendar de Apple que establece la hora de inicio y la hora de finalización. Tengo la vista estupenda, pero me encuentro con dos problemas. Primero, quiero que la primera fila se select automáticamente. Tengo una especie de trabajo utilizando:

NSIndexPath *indexPath=[NSIndexPath indexPathForRow:0 inSection:0]; [dateTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionBottom]; 

Sin embargo, se muestra una animation, seleccionando visualmente el rown cuando se carga la vista, quiero que ya esté seleccionado cuando se carga la vista.

El segundo problema, y ​​mucho más importante, es que cuando vuelvo a cargar los datos después de que el selector se haya actualizado, pierdo la selección y mi tarea simplemente no funciona.

Ahora sé que esta es la acción pnetworkingeterminada de reloadData, estoy buscando un método alternativo para lograr mi objective, o quizás cómo puedo boost reloadData para no deseleccionar la selección actual.

Mi tarea se incluye a continuación:

 -(IBAction)dateChanged { NSIndexPath *index = self.dateTableView.indexPathForSelectedRow; if(index == 0) { if (self.date2 == plusOne ) { self.date = [datePicker date]; plusOne = [self.date dateByAddingTimeInterval:60*60]; self.date2 = plusOne; } else { self.date = [datePicker date]; } } else{ self.date2 = [datePicker date]; } [dateTableView reloadData]; } 

Nota: plusOne es una variable que inicialmente indica una hora a partir de la hora actual.

¡Gracias por adelantado!

Para el primer problema, configure animado: NO en la llamada de método. Actualmente lo está configurando en SÍ.

 [dateTableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionBottom]; 

Para el segundo problema, no está realmente claro qué está tratando de seleccionar después de volver a cargar los datos, pero veo un problema con esta línea:

  if(index == 0) 

Estás preguntando si el puntero al object es 0. Creo que lo que quieres es verificar ese index == nil o ese index.section == 0 && index.row == 0 o algo por el estilo.

De todos modos, si llama a reloadData en UITableView, perderá la selección. En ese momento, debe seleccionar una nueva fila. Si hay un elemento en su model de datos que desea seleccionar, debe averiguar dónde está y seleccionarlo en function de dónde se ubicará en la tabla (Debe saber esto porque proporciona esa información en el delegado UITableViewDataSource methods). De forma alternativa, si desea seleccionar el NSIndexPath que guardó en la primera línea de dateChanged , simplemente selecciónelo después de volver a cargar los datos.

Para el primer problema, escriba su código en didSelectRowAtIndexPath: en un método. A continuación, puede llamar a este método desde didSelectRowAtIndexPath: debe pasar indexPath como argumento a su function como,

 -(void)doActionsInDidSelectRow:(NSIndexPath*)indexPath{ // write code. } 

En viewDidLoad, llame a este método como

 -(void)viewDidLoad{ NSIndexPath *indexPath=[NSIndexPath indexPathForRow:0 inSection:0]; [dateTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionBottom]; [self doActionsInDidSelectRow:indexPath]; } 

Para el segundo problema, mi sugerencia es que cada vez que seleccionas una celda almacene el text de esa celda en un NSString. Cuando vuelvas a cargar datos, dentro de cellForRowAtIndexPath: simplemente compara el text de la celda con el contenido de la cadena que almacenaste previamente. Si son iguales, simplemente haga la selección usando

 [dateTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionBottom]; 

método. Espero que esto resuelva tus problemas.