scrollsToTop no funciona con contención UIViewController

Usando SDK 6.1, Xcode 4.6.1, hago un nuevo proyecto Master-Detail iOS App, ARC, sin storyboards.

Luego, en DetailViewController , en viewDidLoad agrego dos UITableView s contenidos en UIViewController s y me aseguro de que el segundo esté oculto así:

 - (void)viewDidLoad { [super viewDidLoad]; UIViewController *lViewController1 = [[UIViewController alloc] init]; UITableView *lTableView1 = [[UITableView alloc] initWithFrame: self.view.frame]; lTableView1.scrollsToTop = YES; [lViewController1.view addSubview: lTableView1]; lTableView1.dataSource = self; [self.view addSubview: lViewController1.view]; [self addChildViewController: lViewController1]; UIViewController *lViewController2 = [[UIViewController alloc] init]; UITableView *lTableView2 = [[UITableView alloc] initWithFrame: self.view.frame]; lTableView2.scrollsToTop = YES; [lViewController2.view addSubview: lTableView2]; lTableView2.dataSource = self; [self.view addSubview: lViewController2.view]; [self addChildViewController: lViewController2]; // now hide the view in view controller 2 lViewController2.view.hidden = YES; } 

(Me aseguro de que DetailViewController es una DetailViewController datos que devuelve 100 filas de UITableViewCell s con textLabel.text establecido en @"hello" )

La presencia del segundo controller de vista hace que scrollsToTop (tocando en la barra de estado) ya no funciona. Si no UIViewController contención de UIViewController y solo agrego dos UITableView y establezco que UITableView el segundo, scrollsToTop sí funciona.

¿Qué estoy haciendo mal?

Actualmente estoy experimentando con tu proyecto. Cuando

 lViewController2.view.hidden = YES; 

se reemplaza con

 lTableView2.hidden = YES; 

entonces el desplazamiento funciona, incluso con la contención del controller.

Intenté insert una vista entre la vista del controller y la tabla y luego oculté esta vista, pero la tabla no estaba desplazándose.

Traté de ocultar el controller experimentando con shouldAutomaticallyForwardAppearanceMethods pero la tabla no estaba desplazándose.

Resultado: en mis experimentos, solo una vista de desplazamiento debe estar visible en la jerarquía de vista y la propiedad hidden de las vistas principales no se desprotege. hidden debe establecerse en NO en todas las demás vistas de desplazamiento, no en las vistas principales.

scrollsToTop solo funciona en una única vista visible. De la documentation :

Este gesto funciona en una sola vista de desplazamiento visible; si hay varias vistas de desplazamiento (por ejemplo, un selector de date) con este set de properties, o si el delegado devuelve NO en scrollViewShouldScrollToTop: UIScrollView ignora la request. Después de que la vista de desplazamiento se desplaza a la parte superior de la vista de contenido, envía al delegado un post scrollViewDidScrollToTop:

Podría intentar llamar [tableView setContentOffset:CGPointZero animated:YES] en cada una de sus vistas de tabla (o desplazamiento) manualmente. Para hacer esto, implemente el método scrollViewShouldScrollToTop: en el protocolo UIScrollViewDelegate :

 - (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView { [lTableView1 setContentOffset:CGPointZero animated:YES]; [lTableView2 setContentOffset:CGPointZero animated:YES]; return NO; } 

Solo puede configurar 1 ScrollView por ViewController con la propiedad .scrollsToTop = YES. Si configura 2 scrollview.scrollsTopTop = YES, simplemente dejará de funcionar.

 ie: your sample project (DetailViewController.m) update following lines, line48: lTableView1.scrollsToTop = YES; line56: lTableView2.scrollsToTop = NO; 

entonces, scrollsToTop funciona correctamente. Si hay más de 1 scrollview que desea establecer al mismo time SetScrollsToTop, continúe buscando. ¡buena suerte!

Después de probar varias opciones y varios golpes e intentar finalmente setBounds: a una solución final, es decir, setBounds: de scrollView (que es tableView en su caso) y funciona bien. Tendrás que poner un esfuerzo extra para la animation aunque.

  CGRect frame = scrollView.frame; frame.origin.x = 0; frame.origin.y = 0; [scrollView setBounds:frame]; 

Por cierto en su caso, trate de devolver YES a

 - (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView; 

Aunque si no está definido, asume SÍ.

He usado esto y ahora funciona bien.

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. UIViewController *lViewController1 = [[UIViewController alloc] init]; UITableView *lTableView1 = [[UITableView alloc] initWithFrame: self.view.frame]; lTableView1.scrollsToTop = YES; [lViewController1.view addSubview: lTableView1]; lTableView1.dataSource = self; [self.view addSubview: lViewController1.view]; [self addChildViewController: lViewController1]; lTableView1.tag=1; UIViewController *lViewController2 = [[UIViewController alloc] init]; UITableView *lTableView2 = [[UITableView alloc] initWithFrame: self.view.frame]; lTableView2.scrollsToTop = NO; [lViewController2.view addSubview: lTableView2]; lTableView2.dataSource = self; [self.view addSubview: lViewController2.view]; [self addChildViewController: lViewController2]; lTableView2.tag=2; // now hide the view in view controller 2 lViewController2.view.hidden = YES; } - (NSUInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSUInteger)section { return 50; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString * const kCellIdentifier = @"MyCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellIdentifier]; } cell.textLabel.text = [NSString stringWithFormat:@"hello %d %d",indexPath.row, tableView.tag]; return cell; }