如何防止第二次单击UITableView

时间:2014-07-22 20:07:24

标签: ios objective-c uitableview

我的应用程序在tableView:didSelectRowAtIndexPath中调用一个块,并在块中显示一个视图控制器。如果我在第一次单击正在进行时第二次单击该单元格,则会崩溃。 如何防止第二次单击该单元格?

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


    [dataController fetchAlbum:item
         success:^(Album *album) {
            ...
            ...

            [self presentViewController:photoViewController animated:YES completion:nil];


               }];

6 个答案:

答案 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
}

这样,您就不会因为健忘而容易出错。