Ios 单次点击时未调用UITableView didSelectRowatIndexPath

Ios 单次点击时未调用UITableView didSelectRowatIndexPath,ios,uitableview,Ios,Uitableview,非常非常奇怪!它在任何地方都有效,但在这里除外: - (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { MyViewController* cliente = [[MyViewController alloc] initWithModeAndClientId:2 c:cid]; cliente.delegate

非常非常奇怪!它在任何地方都有效,但在这里除外:

- (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
! 如果我点击两次,它会快速显示! 在探查器中,只需单击一下,什么都不会发生。。。
我没有
didDeceloseRowAtIndexPath
方法。

解决方案是在主线程上加载第二个控制器

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

它的线程问题是,当您在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];
    });
}

您是否碰巧将tableview放在滚动视图中?如果是这样,容器滚动视图将阻止内部表视图的触摸事件。这为我解决了这个问题:

self.myContainerScrollview.panGestureRecognizer.delaysTouchesBegan = true

答案应该归功于这里的OP:

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

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

您应该返回indexPath

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

如果
allowsMultipleSelection
设置为
true
,则表视图选择机制将发生变化,通过选择每个单元格,第一次调用
tableView DidSelectRowatineXpath:
,第二次选择同一单元格,将调用
tableView DidSelectRowatineXpath:
打电话来

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

这意味着,如果一个单元格被点击的次数是奇数(1、3、5,…),那么将始终调用
tableView didSelectRowAtIndexPath:
,如果一个单元格被点击的次数是偶数(2、4、6,…),那么将始终调用
tableView didSelectRowAtIndexPath:

如果希望对单元格的每个选择调用
tableView didSelectRowAtIndexPath:
,则必须将tableView多选设置为
false
tableView.allowsMultipleSelection=false

这样做,,每次点击单元格时,将在表视图上调用
tableView-didSelectRowAtIndexPath:
,并通过选择另一个单元格
tableView-didSelectRowAtIndexPath:
,将调用之前选中的单元格,然后将调用
tableView-didSelectRowAtIndexPath:
新选择的单元格

类TableViewController:UITableViewController{
重写func viewDidLoad(){
super.viewDidLoad()
tableView.allowsMultipleSelection=false
}
重写func tableView(tableView:UITableView,didSelectRowAt indexPath:indexPath){
打印(“将为每个单元格点击调用此命令”)
}

您的手机顶部是否有任何手势识别器或视图可能捕捉到敲击声?没有人…如果我使用[[self-navigationController]pushViewControllerRetro:SchedaClient],相同的代码可以快速工作;您的视图控制器初始化代码是否会被阻塞?使用Instruments->Time Profiler查看您的代码是否花费了很长时间。我这样做了,但时间配置文件没有什么帮助,因为两次单击之间似乎什么都没有发生:(第一提示:如果我设置动画:否,则显示是实时的!(iOS7)您是否在与主线程不同的线程上收到tableView:DidSelectRowatineXpath:。抱歉,我的意思是tableView:DidSelectRowatineXpath:。我只是想知道为什么dispatch_async会这样做。这可能与线程或动画有关。嗯,我想DidSelecte在主线程上。它怎么可能在不同的线程上nt线程?