【问题标题】:App freezes after deleting UITableViewCell删除 UITableViewCell 后应用程序冻结
【发布时间】:2015-04-21 09:16:20
【问题描述】:

当我尝试在请求的成功块中删除 UITableViewCell 时出现问题。

在我的

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

我正在向 AFNetworking 提出请求

- (NSURLSessionDataTask *)POST:(NSString *)URLString
                    parameters:(id)parameters
                       success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                       failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

在成功阻止之后,我通过关闭 SVProgressHUD 并删除单元格来更新 UI:

NSUserDefaults *usd = [NSUserDefaults standardUserDefaults];
[usd removeObjectForKey:@"payViaCreditCard"];
selectedCardID = nil;

[[CreditCardManager sharedCreditCardManager] removeCreditCard:creditCardToDelete];
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView reloadData];

最后,当我重新启动应用程序时,我的 UI 没有更新并且应用程序冻结,NSUserDefaults 中的数据发生了变化。

【问题讨论】:

  • 与您的问题无关,但在deleteRowsAtIndexPaths 之后调用reloadData 是没有意义的。
  • 删除reloadData,你应该很高兴。
  • 我的 UITableView 总是有一个复选标记,所以在 reloadData 之后,如果 UITableViewCell 删除了复选标记,默认情况下第一个单元格将具有复选标记。

标签: ios objective-c uitableview afnetworking


【解决方案1】:

如果您选择deleteRowsAtIndexPaths:withRowAnimation 或tableView reloadData,那就太好了。

    [[CreditCardManager sharedCreditCardManager] removeCreditCard:creditCardToDelete];
    [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];

    OR 

    [[CreditCardManager sharedCreditCardManager] removeCreditCard:creditCardToDelete];
    [self.tableView reloadData];

【讨论】:

  • 第二种方法对我没有帮助,我在发布问题之前尝试了第一种,但是我的 UITableView 总是有一个复选标记,所以删除单元格后我需要重新加载数据
  • 延迟工作后重新加载,但我不明白为什么应用程序在尝试立即重新加载时冻结。
  • 在UITableViewRowAnimationFade动画被动画化的时候,同时重载会产生凝聚力。
【解决方案2】:

要删除单元格,您应该使用

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
   return UITableViewCellEditingStyleDelete; 
} 

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{
   if (editingStyle == UITableViewCellEditingStyleDelete) 
   {
      NSUserDefaults *usd = [NSUserDefaults standardUserDefaults];
      [usd removeObjectForKey:@"payViaCreditCard"];
      selectedCardID = nil;

      [[CreditCardManager sharedCreditCardManager] removeCreditCard:creditCardToDelete];
      [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
      //[self.tableView reloadData];
    }
}

【讨论】:

  • 我的 UITableView 总是有一个复选标记,所以在 reloadData 后,如果 UITableViewCell 删除了复选标记,默认情况下第一个单元格会有复选标记。
  • @Chika 我认为与其重新加载整个表,不如在删除任何带有复选标记的行后重新加载第 0 个索引(第一个单元格)处的行
  • @Chika,你有什么想法?
  • 我尝试只重新加载第一个单元格,但结果相同
  • 您是否更新了模式以在重新加载第一个单元格之前添加复选标记?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
相关资源
最近更新 更多