【问题标题】:UITableView (inside UIScrollView) didSelectRowAtIndexPath: not being called on first tapUITableView(在 UIScrollView 内)didSelectRowAtIndexPath:第一次点击时没有被调用
【发布时间】:2015-01-20 01:08:03
【问题描述】:

我在UIScrollView 中有一个不可滚动的UITableView。而且我遇到的问题是,当我触摸一行时,回调didSelectRowAtIndexPath: 不会在第一次点击时被调用,但在第一次点击后一切正常。

一些注意事项:

  • 第一次点击后,表格视图正常工作,每次点击都可以在每个单元格中工作。
  • 这发生在我滚动 UIScrollView 之后。如果我不滚动 UIScrollView,这永远不会发生。
  • 我已经覆盖了 UIScrollView 的 touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view 并且事件确实在这里通过了 throw,view 是一个 UITableViewCellContentView 有效。

我只是不知道为什么第一次没有将事件发送到UITableView,而在接下来的事件中它确实发送了。

【问题讨论】:

  • 仔细检查以确保您不使用 - tableView:didDeselectRowAtIndexPath: 而不是 didSelectRowAtIndexPath
  • @Vig 是的,在第一次 Tap 之后,我的 didSelectRowAtIndexPath 实现被调用了。
  • 为什么要在滚动视图中嵌入不可滚动的表格视图?
  • 点击单元格时会发生什么吗?推一个 ViewController 什么的?
  • @sha 因为我使用了 UITableView 的功能和外观。例如,在没有 UITableView 的情况下动态插入和删除行将很难实现。

标签: ios objective-c iphone uitableview uiscrollview


【解决方案1】:

请禁用表格视图的滚动并检查数据源和委托是否已连接到您的表格视图。如果不遵循以下代码

@interface myClass ()<UITableViewDataSource, UITableViewDelegate>

- (void)viewDidLoad {
    [super viewDidLoad];

    self.myTableView.scrollEnabled = NO;
    self.myTableView.delegate = self;
    self.myTableView.dataSource = self;
}

【讨论】:

    【解决方案2】:

    如果您有包含垂直内容的UIScrollView 并且UITableView 作为此内容的一部分,您必须至少禁用UITableView 上的滚动 - 否则用户何时滚动您的mainView 以及何时滚动会使用户感到困惑tableView,也让框架感到困惑,因为不清楚将平移手势发送到哪里。

    根据经验,您应该避免将表格视图放在 scrollViews 中,除非您真的知道自己在做什么。

    【讨论】:

    • 表格视图的滚动被有效禁用。 ://
    • effectively 禁用的具体情况如何?
    • 我禁用了故事板 UITableView 复选框“启用滚动”中的滚动。我的猜测是滚动视图仍然认为第一次点击是先前滚动事件的一部分,但仍然不知道为什么。
    • 您需要发布一些代码。你在 UIScrollview 中改变了哪些与触摸相关的方法,你在那里做了什么等等。
    • 我刚刚重写了touchesShouldCancelInContentView 以始终返回TRUE,以及委托方法scrollViewDidScroll。在表格视图中,委托方法didSelectRowAtIndexPath,该方法是第一次点击时未调用的方法。
    猜你喜欢
    • 2011-01-07
    • 2012-02-24
    • 2015-03-10
    • 2023-04-01
    • 2015-02-22
    • 2015-05-17
    • 2014-03-07
    • 1970-01-01
    相关资源
    最近更新 更多