UITableView在UIScrollView中滚动出现问题

8

我有一个UIScrollView(带分页功能),其中我添加了三个UIView。每个UIView内部都有一个UITableView。因此,用户应该能够水平滚动到所需页面,然后在相应的表格中垂直滚动。

然而,有些表格无法接收滚动手势。通常第一个表现良好,但其他的不行。我不能选择单元格,也不能向上或向下滚动表格。

我使用了UIScrollView的默认设置,除了viewDidLoad中定义的这些设置:

- (void)viewDidLoad
{
    [super viewDidLoad];

    //Load the view controllers
    [self loadViewControllers];

    //Configure the scroll view
    self.scrollView.pagingEnabled = YES;
    self.scrollView.contentSize = CGSizeMake(CGRectGetWidth(self.scrollView.frame) * viewControllers.count, CGRectGetHeight(self.scrollView.frame));
    self.scrollView.showsHorizontalScrollIndicator = NO;
    self.scrollView.showsVerticalScrollIndicator = NO;
    self.scrollView.scrollsToTop = NO;
    self.scrollView.delegate = self;

    //Configure the page control
    self.pageControl.numberOfPages = viewControllers.count;
    self.pageControl.currentPage = 0;
}

我不知道为什么有些表格无法滚动... 能否帮忙解决一下?非常感谢!

提前致谢!

4个回答

4
尝试进行设置。
self.scrollView.delaysContentTouches = YES;
self.scrollView.canCancelContentTouches = NO;

也许 UIScrollView 没有将触摸信息传递给其子视图。

我尝试通过界面构建器来解决这个问题,但没有成功。我是应该在代码中实现还是有其他方法? - Sagito

4
我尝试使用基本的Interface Builder重现了您的需求的简化版本,似乎它使用基本的编码和默认设置就可以工作。请检查我的快速且简陋的Github存储库,并友好地询问是否适用于您的情况或者还缺少什么。

https://github.com/codedad/SO_ScrollView_with_Tables

默认情况下,界面生成UIScrollView和UITableView,启用以下功能:

  • 延迟内容触摸开启
  • 可取消内容触摸开启

我在示例中没有为所有表格使用单独的视图控制器,因为一个视图控制器作为所有表格的数据源足够了,因为您可以在cellForRowAtIndexPath和numberOfRowsInSection中使用“tableView”参数来区分不同的表格。 - nzs
好的,看起来你和@hw731都是正确的,因为在你的例子和hw371发布的链接中,区别在于UITableView的大小。我的表格有几个像素太大了,而在你的例子中它们适合得当,这似乎是我的代码的问题。 :-) 非常感谢! - Sagito
不用谢! ;) 总是希望具体的工作代码可以更多地帮助他人。如果您能赞同这个答案,这可能会提示其他人也检查一下示例。谢谢! - nzs
当然可以!只是有点遗憾,我不能将两个都标记为所选答案。 ;) - Sagito
你能否尝试使用故事板来完成这个任务?我已经尝试了三天,但是找不到相关的教程。非常感谢! - Timo Cengiz

2

我会检查以下内容:

  1. 检查你的视图层级结构 - 是否有什么被放在你的UITableView上面,导致它没有接收到点击信号?
  2. 你的UITableView是否被禁用了?我会在 tableView:didSelectRowAtIndexPath: 方法中设置断点,看看该方法是否被调用。
  3. 检查这篇帖子

我猜这些并不是百分百的答案,但希望它们可以帮助你发现问题!


嗯,我没有其他的看法。当前层次结构大致如下:UIView
  • UIScrollView --- UIView ----- UITableView
但是,你说得很对...在“尝试”滚动期间不会调用tableView:didSelectRowAtIndexPath方法。但我没有故意禁用它。有什么想法为什么它会被禁用?
- Sagito
你的UITableView是否调用了任何委托/数据源方法? - hgwhittle
1
是的,我为每个UITableView都有一个UIViewController,它既是表格的代理又是数据源。 - Sagito
我之前偶然看到了那个答案,但实际上我没有记得去检查UITableView是否超出了UIScrollView的限制。我会去检查并回复。谢谢! - Sagito
那其实就是问题所在。我的UITableView比滚动视图大几个像素,显然这就导致了问题。非常感谢! - Sagito

0

这对我有用

我使用addSubview:编程方式将tableView添加到我的滚动视图中

需要UIGestureRecognizerDelegate

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {

    if ([touch.view isDescendantOfView:self.signUpJammerList]) {

        return NO;
    }
    return YES;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接