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线程?