【问题标题】:UITableView didSelectRowatIndexPath not called on single tapUITableView didSelectRowatIndexPath 未在单击时调用
【发布时间】:2013-12-07 14:06:00
【问题描述】:

非常非常奇怪!它适用于任何地方,但在这里:

- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{
 MyViewController* cliente = [[MyViewController alloc] initWithModeAndClientId:2 c:cid];

            cliente.delegate                    = self;
            UINavigationController *n = [[UINavigationController alloc] initWithRootViewController:cliente];

            n.navigationBarHidden     = NO;
            [[n navigationBar] setBarStyle:UIBarStyleBlack];
            [self presentViewController:n animated:YES completion:nil];
}

如果我单击该行,MyViewController 会在几秒钟后显示! 如果我单击两次,它会迅速显示! 在 Profiler 中,单击一下没有任何反应... 我没有didDeselectRowAtIndexPath 方法。

【问题讨论】:

  • 您的单元格顶部是否有任何手势识别器或视图可能会捕捉到点击?
  • 没有人...如果我使用 [[self navigationController] pushViewControllerRetro:schedaCliente];
  • 您的视图控制器初始化代码会阻塞吗?使用 Instruments -> Time Profiler 查看您的任何代码是否花费了很长时间。
  • 我做到了,但时间配置文件几乎没有帮助,因为两次点击之间似乎没有发生任何事情:(
  • 第一个提示:如果我设置动画:NO,节目是实时的! (iOS7)

标签: ios uitableview


【解决方案1】:

我的 tableView(swift 4.2) 上遇到了同样的问题。经过调试并花费大量时间后,表格视图似乎有一个名为 allowsMultipleSelection 的布尔属性。

如果allowsMultipleSelection 设置为true,表格视图选择机制将发生变化,通过选择每个单元格,第一次调用tableView didSelectRowAtIndexPath:,第二次选择相同的单元格@ 987654325@ 被调用。

这使得tableView didSelectRowAtIndexPath: 函数在同一个单元格的第三个选择中被调用,因此结果是双击调用didSelectRowAtIndexPath:

这意味着如果一个单元格被点击的次数是奇数 (1, 3, 5, ...) 那么总是tableView didSelectRowAtIndexPath: 将被调用并且如果一个单元格被点击的次数是偶数 (2, 4 , 6, ...) 然后总是会调用tableView didDeselectRowAtIndexPath:

如果您希望在每个单元格的选择上调用tableView didSelectRowAtIndexPath:,那么 tableView multiple selection 必须设置为falsetableView.allowsMultipleSelection = false

通过这样做,每次点击单元格时,tableView didSelectRowAtIndexPath: 都会在表格视图中被调用,通过选择另一个单元格 tableView didDeselectRowAtIndexPath: 将被调用,因为 之前选择了单元格,然后是 @ 新选择的单元格会调用 987654335@。

    class TableViewController: UITableViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.allowsMultipleSelection = false
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("This will be called for each cell tap")
    }

【讨论】:

    【解决方案2】:

    遇到了同样的问题。而且很难找到。但这是因为:

    - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
            return nil;
    }
    

    你应该返回 indexPath

    【讨论】:

      【解决方案3】:

      你有没有机会在滚动视图中放置一个表格视图?如果是这样,容器滚动视图会阻止内部表视图的触摸事件。这为我解决了问题:

      self.myContainerScrollview.panGestureRecognizer.delaysTouchesBegan = true
      

      答案的功劳应归于此处的 OP:https://stackoverflow.com/a/31040918/1455770

      【讨论】:

        【解决方案4】:

        它的线程问题,当您在 tableview 中点击一行时,它会启动一个新线程,因此呈现视图可能需要更长的时间才能显示在屏幕上。

        解决办法是:

        - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
        { 
            dispatch_async(dispatch_get_main_queue(), ^{
        
                MyViewController* cliente = [[MyViewController alloc] initWithModeAndClientId:2 c:cid];
        
                cliente.delegate = self;
                UINavigationController *n = [[UINavigationController alloc] initWithRootViewController:cliente];
        
                n.navigationBarHidden = NO;
                [[n navigationBar] setBarStyle:UIBarStyleBlack];
                [self presentViewController:n animated:YES completion:nil];
            });
        }
        

        【讨论】:

          【解决方案5】:

          解决办法是把第二个控制器的加载放到主线程上

           dispatch_async(dispatch_get_main_queue(), ^{ 
                 // Code here 
           });
          

          【讨论】:

          • 您是否收到 tableView: didDeselectRowAtIndexPath: 与主线程不同的线程?
          • 对不起,我的意思是 tableView:didSelectRowAtIndexPath:。我只是想看看为什么 dispatch_async 可以做到这一点。它要么与线程有关,要么与动画有关。
          • 好吧,我想 didSelect 在主线程上。它怎么可能在不同的线程上?
          猜你喜欢
          • 2012-02-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-10
          • 2012-09-18
          • 2011-01-07
          • 2015-04-07
          相关资源
          最近更新 更多