在编辑模式下按下删除按钮时 UITableView 崩溃

Posted

技术标签:

【中文标题】在编辑模式下按下删除按钮时 UITableView 崩溃【英文标题】:UITableView crashes when pressing delete button in edit mode 【发布时间】:2013-04-20 23:39:58 【问题描述】:

在编辑 UITableView 时,应用程序通常会在有人按下 uitableviewcell 上的“删除”按钮后崩溃并显示此错误。这通常发生在表格视图中的第一个项目上,但也发生在其他项目上。我很抱歉如此含糊,我可以提供任何额外的信息。我只是对为什么会发生这种情况以及为什么会发生这种情况感到非常困惑。

* 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“-[__NSCFArray removeObjectAtIndex:]: mutating method sent to immutable object”

- (void)viewDidLoad

    [super viewDidLoad];
    self.navigationItem.leftBarButtonItem = self.editButtonItem;


-(void)viewWillAppear:(BOOL)animated
    [_matchIDS removeAllObjects];
    _matchIDS = [[NSMutableArray alloc]init];
    _matchIDS = [[NSUserDefaults standardUserDefaults] valueForKey:@"allMatchIDS"];
    [self.tableView reloadData];


-(void)viewWillDisappear:(BOOL)animated
    NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
    [defaults setValue:_matchIDS forKey:@"allMatchIDS"];
    [defaults synchronize];


#pragma mark - Table View

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    return 1;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    return _matchIDS.count;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.textLabel.text = _matchIDS[indexPath.row];
    return cell;


- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath

    return YES;


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

    if (editingStyle == UITableViewCellEditingStyleDelete) 
        [_matchIDS removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    

【问题讨论】:

【参考方案1】:

错误是由于试图从 _matchIDS 数组中删除一个元素而导致的,该数组是不可变的。

 [_matchIDS removeObjectAtIndex:indexPath.row];

您尝试在此处使数组可变:

-(void)viewWillAppear:(BOOL)animated
    [_matchIDS removeAllObjects];
    _matchIDS = [[NSMutableArray alloc]init];
    _matchIDS = [[NSUserDefaults standardUserDefaults] valueForKey:@"allMatchIDS"]; // <---
    [self.tableView reloadData];

但上面标记的行替换了 _matchIDS,丢弃了您实例化的 NSMutableArray。您可能想改用 mutableCopy 方法,结果如下:

_matchIDS = [[[NSUserDefaults standardUserDefaults] valueForKey:@"allMatchIDS"] mutableCopy];

【讨论】:

以上是关于在编辑模式下按下删除按钮时 UITableView 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

UITableview 编辑模式时不出现左删除图标

在Android N多窗口模式下按下主页按钮时未调用Activity onStop()

当显示删除按钮时,IPhone UITableView 抑制显示按钮

在 UITableview 的编辑模式下滚动时删除按钮消失

UITableView 删除行,commitEditingStyle 方法没有触发?

在 SwiftUI 分组表中按下编辑模式按钮之前不会删除行