我的应用程序在tableView:didSelectRowAtIndexPath中调用一个块,并在块中显示一个视图控制器。如果我在第一次单击正在进行时第二次单击该单元格,则会崩溃。 如何防止第二次单击该单元格?
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
[dataController fetchAlbum:item
success:^(Album *album) {
...
...
[self presentViewController:photoViewController animated:YES completion:nil];
}];
答案 0 :(得分:9)
在didSelectRow
开头,关闭桌面上的用户互动。
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
tableView.userInteractionEnabled = NO;
...
您可能希望稍后在fetchAlbum
完成时将其重新打开(在主线程上执行此操作),以便在用户返回此视图(或获取失败)时,他们可以与再次表。
答案 1 :(得分:4)
对于swift 3:
当用户选择一行时,请关闭用户互动:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.isUserInteractionEnabled = false
每当视图出现时,别忘了将其打开:
override func viewDidAppear(_ animated: Bool) {
tableView.isUserInteractionEnabled = true
}
答案 2 :(得分:1)
您可以阻止多次点击(通过禁用表格或使用微调器覆盖它),也可以让didSelectRowAtIndexPath
同步显示您的视图控制器 并加载您的“相册”它已被呈现。我是后者的粉丝,因为它让UI感觉更敏感。
答案 3 :(得分:0)
您想禁用单元格上的用户互动:
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
cell.userInteractionEnabled = NO;
正如Stonz2指出的那样,你可能想要在整个桌面视图中这样做,而不是特定的单元格,如果你正在展示VC。
答案 4 :(得分:0)
let cell = tableView.cellForRowAtIndexPath(indexPath)
cell?.userInteractionEnabled = false
然后 在导航到另一个视图之前设置回true,否则当您返回到表格时,单元格仍将被禁用。
答案 5 :(得分:0)
更清洁的方法:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
defer {
tableView.isUserInteractionEnabled = true
}
tableView.isUserInteractionEnabled = false
}
这样,您就不会因为健忘而容易出错。