dismissModalViewControllerAnimated restablece el contenido de Offset

Tengo un problema con mi vista de tabla. Cuando se descarta un controller de vista modal presentado encima, siempre se desplaza hacia la parte superior. He intentado observar los cambios en contentOffset usando KVO, pero el que ensucia mi vista va detrás de él.

Desde UITableViewController , cuando el usuario termina su tarea en el cuadro de dialog modal, self.tableView.contentOffset es, llamo:

 [self dismissModalViewControllerAnimated:YES] 

Posteriormente, cuando se viewWillAppear:(BOOL)animated la vista viewWillAppear:(BOOL)animated la viewWillAppear:(BOOL)animated , la self.tableView.contentOffset ya está establecida en 0,0.

¿Se supone que esto está sucediendo? Puedo evitar el problema recordando la position de desplazamiento antes de presentar la vista modal y restaurarla de nuevo en viewWillAppear después de descartar la vista modal. Pero parece mal. ¿Me estoy perdiendo de algo?

He encontrado un problema similar descrito en Descartar cambios de vista modal subyacentes a UIScrollView .

Parece que este es el comportamiento pnetworkingeterminado de UITableViewController. Lo probé en una aplicación muy simple y funcionó exactamente como lo dijiste. Si no te gusta, usa UIViewController en su lugar.

Aquí es cómo soluciono este problema, para que la vista de tabla mantenga la position de desplazamiento original. En mi subclass de UITableViewController he agregado:

 @property (assign) CGPoint lastScrollPosition; 

Luego, en la implementación, he anulado lo siguiente:

 - (void)viewWillAppear:(BOOL)animated { self.tableView.contentOffset = self.lastScrollPosition; } - (void)dismissModalViewControllerAnimated:(BOOL)animated { self.lastScrollPosition = self.tableView.contentOffset; [super dismissModalViewControllerAnimated:animated]; } 

Si desea que su tabla aparezca inicialmente desplazada a una position distinta de cero, como lo hice, no olvide inicializar la lastScrollPosition en su viewDidLoad .