UITableView se desplaza automáticamente después de una reloadData

Tengo una vista de tabla que se desplaza automáticamente hacia abajo en mi aplicación iPad (OS X 10.7.3, Xcode 4.3.2), y no estoy seguro de dónde search la causa. Esta es la situación:

La UITableView llena toda la pantalla, y la mayoría de las celdas son celdas de altura fija. La única exception es una celda que contiene una UITextView, y es de altura dinámica (o en otras palabras, la altura de la celda se ajusta para ajustarse a la cantidad de text).

El problema se manifiesta si la tabla pasa a tener la celda de altura dinámica cortada cuando la vista de tabla está en la parte superior. Cuando la vista se carga por primera vez, la tabla se dibuja de manera normal, con solo una parte de la celda UITextView visible. Sin embargo, si muestro un UIPopoverController, necesito hacer una reloadData después de que se elimine el popover, y cuando lo hago, la vista de la tabla se desplazará hacia abajo lo suficiente como para mostrar todo UITextView. (No es la celda que contiene UITextView, solo la UITextView. La tabla es una tabla agrupada, y la celda UITextView es la única celda de la sección, por lo que el borde inferior networkingondeado aún no se puede ver después de este desplazamiento fantasma).

No puedo ver ningún código en mi aplicación que esté desplazando la vista de la tabla o configurando un desplazamiento de contenido, así que estoy totalmente confundido sobre lo que podría estar causando esto.

Para tratar de networkingucirlo, instalé mi vista para honrar a UIScrollViewDelegate, y si pongo un punto de interrupción en el método scrollViewDidScroll: el progtwig de hecho se detiene después de que el popover desaparece y me da el siguiente trazo hacia atrás:

(lldb) bt * thread #1: tid = 0x1f03, 0x0005245f MyApp`-[ContactDisplayViewController scrollViewDidScroll:] + 31 at ContactDisplayViewController.m:1143, stop reason = breakpoint 3.1 frame #0: 0x0005245f MyApp`-[ContactDisplayViewController scrollViewDidScroll:] + 31 at ContactDisplayViewController.m:1143 frame #1: 0x017e3494 UIKit`-[UIScrollView setContentOffset:] + 521 frame #2: 0x0180804d UIKit`-[UITableView setContentOffset:] + 334 frame #3: 0x017d495e UIKit`-[UIScrollViewScrollAnimation setProgress:] + 523 frame #4: 0x0183d234 UIKit`-[UIAnimator(Static) _advance:] + 255 frame #5: 0x02c013a3 GraphicsServices`HeartbeatTimerCallback + 35 frame #6: 0x023278c3 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19 frame #7: 0x02328e74 CoreFoundation`__CFRunLoopDoTimer + 1220 frame #8: 0x022852c9 CoreFoundation`__CFRunLoopRun + 1817 frame #9: 0x02284840 CoreFoundation`CFRunLoopRunSpecific + 208 frame #10: 0x02284761 CoreFoundation`CFRunLoopRunInMode + 97 frame #11: 0x02bfe1c4 GraphicsServices`GSEventRunModal + 217 frame #12: 0x02bfe289 GraphicsServices`GSEventRun + 115 frame #13: 0x017a4c93 UIKit`UIApplicationMain + 1160 frame #14: 0x0000263d MyApp`main + 125 at main.m:14 

Y si imprimo el scrollView en ese método, muestra que el UITableView está en movimiento (no estoy seguro de dónde viene el contenido de los ajustes):

 Printing description of scrollView: <UITableView: 0xc3ed400; frame = (0 99; 383 817); clipsToBounds = YES; autoresize = W+RM+H; layer = <CALayer: 0x7bf1a40>; contentOffset: {0, 14}> 

Este desplazamiento fantasma se muestra en el dispositivo y el simulador, y en iOS 4.3, 5.0 y 5.1. ¿Alguien tiene alguna idea?

Tengo un vago recuerdo de haber oído algo sobre esto antes. Dado que UITableViews son una subclass UIScrollView y también lo son UITextViews , puede quedar confundido.

En una conjetura, quizás trate de cambiar algunas properties en el TextView antes de volver a cargar, como desactivar el desplazamiento.

 [myTextView setScrollEnabled:NO]; 

Cuando un UITextView se convierte en primer respondedor (a partir de iOS 3, creo), si está dentro de un UIScrollView / UITableViewController, el scrollview se desplazará automáticamente por iOS para asegurarse de que UITextView esté visible.

Para una solución, eche un vistazo a: Deshabilitar el desplazamiento UIScrollView cuando UITextField se convierte en el primer respondedor

Subclass la subclass UIScrollView (en mi caso subclasificada UITextField ) y asegúrese de no aceptar compensaciones de contenido "arbitrarias":

 override var contentOffset: CGPoint { set { let maxContentOffsetY = max(self.contentSize.height - self.frame.size.height, 0.0) super.contentOffset.y = min(newValue.y, maxContentOffsetY) } get { return super.contentOffset } }