当UITableView嵌套在UIScrollView中时,如何触发scrollsToTop

时间:2011-09-29 04:10:04

标签: iphone ios

我想知道当UITableView嵌套在同时观察此功能的UIScrollView中时,是否有人从用户点击状态栏触发了对于UITableView的scrollsToTop(或通过任何其他方式)运气?我知道这可能不是一种好的做法,但在这种情况下,UX会调用这种类型的层次结构。

无论哪种方式,我都看到了很多提议,从私有方法(显然不会发生)到在状态栏上添加虚假窗口(也不会发生)。

4 个答案:

答案 0 :(得分:13)

好的,所以这里的答案有两个:

  1. 在同一个UIView上,属性scrollsToTop设置为YES,不能有多个UIScrollView(或从UIScrollView派生或使用UIScrollView的类 - 即UITableView)。选择您想要拥有该功能的那个,并确保所有其他功能都没有

    例如,执行此操作:

    scrollView.scrollsToTop = NO;
    tableView.scrollsToTop = YES; // or not set
    
  2. 如果调用UIScrollView是UITableView,则实现UIScrollView委托方法scrollViewShouldScrollToTop:return YES

  3. 道具this answer提及非多重scrollsToTop选项。

答案 1 :(得分:12)

只是想分享一些我写的有助于调试这些情况的功能。正如其他人所提到的,你必须确保只有一个滚动视图打开了scrollsToTop。如果嵌入复杂的视图层次结构,可能很难确定哪个滚动视图是罪魁祸首。只需在创建视图层次结构后调用此方法,就像在viewDidAppear中一样。 level参数只是为了帮助缩进,你应该用0来播种它。

-(void)inspectViewAndSubViews:(UIView*) v level:(int)level {

NSMutableString* str = [NSMutableString string];

for (int i = 0; i < level; i++) {
    [str appendString:@"   "];
}

[str appendFormat:@"%@", [v class]];

if ([v isKindOfClass:[UITableView class]]) {
    [str appendString:@" : UITableView "];
}

if ([v isKindOfClass:[UIScrollView class]]) {
    [str appendString:@" : UIScrollView "];

    UIScrollView* scrollView = (UIScrollView*)v;
    if (scrollView.scrollsToTop) {
        [str appendString:@" >>>scrollsToTop<<<<"];
    }
}

NSLog(@"%@", str);

for (UIView* sv in [v subviews]) {
    [self inspectViewAndSubViews:sv level:level+1];
}}

在视图控制器的主视图中调用它。

在日志中,您应该看到&gt;&gt;&gt; scrollsToTop&lt;&lt;&lt;在每个打开它的视图旁边,可以轻松找到错误。

答案 2 :(得分:1)

帮助我解决这个问题的一件事是:

  • 验证视图层次结构中的每个其他UIScollView是否都设置为scollsToTop = NO
  • 使用addChildViewController:将子视图控制器添加为子视图控制器仅将视图作为子视图添加到父视图中是不够的。

答案 3 :(得分:-2)

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];

[gridTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionNone animated:YES];

希望能帮到你:)。