【问题标题】:How to trigger scrollsToTop when UITableView is nested inside UIScrollViewUITableView嵌套在UIScrollView中时如何触发scrollsToTop
【发布时间】:2011-09-29 04:10:04
【问题描述】:

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

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

【问题讨论】:

  • 你的 tableview 驻留在哪个控件中?
  • UIScrollView。对不起。更新了问题。
  • 你试过用 scrollsToTop 来滚动和表格吗?
  • 是的。不适合我。

标签: iphone ios


【解决方案1】:

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

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

    例如,这样做:

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

支持this answer 以提及非多个scrollsToTop 选项。

【讨论】:

    【解决方案2】:

    只是想分享一个我编写的有助于调试这些情况的小函数。正如其他人所提到的,您必须确保只有一个滚动视图打开了 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];
    }}
    

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

    在日志中,您应该会在打开它的每个视图旁边看到 >>>scrollsToTop

    【讨论】:

    • 感谢您的方法。 ;)
    • 这发现了我的问题!谢谢!我希望我能给你的不仅仅是这个小宝石的支持。
    • 你刚刚为我节省了几个小时!谢谢。
    • 该死!超级有用的方法。典型的“我为什么没有想到这个”的时刻。
    • 你需要从view.window向下看!
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:
      NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
      
      [gridTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionNone animated:YES];
      

      希望能帮到你:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-17
        • 2011-01-11
        • 1970-01-01
        • 2015-08-12
        • 1970-01-01
        • 1970-01-01
        • 2010-12-23
        • 1970-01-01
        相关资源
        最近更新 更多