非常奇怪!它适用于所有地方,但在这里:
- (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
方法。
答案 0 :(得分:6)
解决方案是在主线程上加载第二个控制器
dispatch_async(dispatch_get_main_queue(), ^{
// Code here
});
答案 1 :(得分:3)
它的线程问题,当您在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];
});
}
答案 2 :(得分:0)
你是否有机会在滚动视图中放置一个tableview?如果是这样,容器scrollview阻止触摸事件到内部表视图。这为我解决了这个问题:
self.myContainerScrollview.panGestureRecognizer.delaysTouchesBegan = true
答案 3 :(得分:0)
有同样的问题。而且很难找到。但这是因为以下原因:
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
return nil;
}
您应该返回 indexPath
答案 4 :(得分:0)
我在tableView(swift 4.2)上遇到了同样的问题。经过调试并花费大量时间后,表视图似乎具有名为allowsMultipleSelection
的布尔属性。
如果将allowsMultipleSelection
设置为true
,则表视图选择机制将以以下方式更改:通过选择每个单元格,第一次调用tableView didSelectRowAtIndexPath:
并选择同一单元格第二次调用tableView didDeselectRowAtIndexPath:
。
这使得在同一单元格的第三个选择上调用tableView didSelectRowAtIndexPath:
函数,因此结果是双击以调用didSelectRowAtIndexPath:
。
这意味着,如果一个单元被轻击的次数是奇数(1、3、5 ...),那么将总是调用tableView didSelectRowAtIndexPath:
,如果一个单元被轻击的次数是偶数(2 ,4,6,...),则始终会调用tableView didDeselectRowAtIndexPath:
。
如果您希望在单元格的每个选择上调用tableView didSelectRowAtIndexPath:
,则必须设置tableView 多项选择。false
,tableView.allowsMultipleSelection = false
。 / p>
这样做,每次在表视图上点击单元格tableView didSelectRowAtIndexPath:
时,都会通过选择另一个单元格tableView didDeselectRowAtIndexPath:
来调用之前选择的单元格然后将为新选择的单元格调用tableView didSelectRowAtIndexPath:
。
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")
}