美文网首页
iOS UITableView 避免删除数据越界崩溃。

iOS UITableView 避免删除数据越界崩溃。

作者: CarrySniper | 来源:发表于2019-04-28 14:27 被阅读0次

    UITableView删除数据容易崩溃,大部分原因是由于indexPath的值大于数据源数组大小导致的。这里分Row、和Section写法,功能一样的。

    删除功能要求删除下面三项,才算成功。

    • 1.删除网络数据
    • 2.删除数据源数据
    • 3.删除UITableViewCell数据
    一、声明属性,调用方法,方便看代码
    /** 数据源 */
    @property (nonatomic, strong) UITableView *tableView;
    /** 数据源 */
    @property (nonatomic, strong) NSMutableArray *dataArray;
    
    // 1.删除行Row
    [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    // 2.删除组Section
    [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationFade];
    

    二、系统自带左滑删除方法

    说明:这样获取的indexPath是完全正确的,这里删除同步删除了数据源数据和UITableViewCell数据,达到需求,不会崩溃。

    - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
        return YES;
    }
    
    - (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
        UITableViewRowAction *deleteAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"删除" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
            // 删除数据源
            [self.dataArray removeObjectAtIndex:indexPath.row];
            
            // 删除Cell
            [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
        }];
        return @[deleteAction];
    }
    

    三、自定义UITableViewCell,添加删除按钮、点击事件如:

    说明:根据按钮Tag或者Cell传递的indexPath可能错误的,这样的indexPath会保留原值,会和数据源数据大小不一致造成越界和删错数据。这个时候需要用从数据源获取对应的indexPath才是正确的。

    • 正确的做法
    - (void)deleteClickAction:(UIButton *)sender {
        id xxx = 这个按钮所在Cell的数据对象,在tableView: cellForRowAtIndexPath:里面赋值的
        // 获取NSIndexPath
        NSUInteger row = [self.dataArray indexOfObject:xxx];
        NSUInteger section = 1;
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];
        
        // 删除数据源
        [self.dataArray removeObjectAtIndex:indexPath.row];
        
        // 删除Cell
        [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
    
    • 错误的做法。tag的值不等于indexPath的值,当值大于时就会越界崩溃。
    - (void)deleteClickAction:(UIButton *)sender {
        // 获取NSIndexPath
        NSUInteger row = sender.tag;
        NSUInteger section = 1;
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];
        
        // 删除数据源
        [self.dataArray removeObjectAtIndex:indexPath.row];
        
        // 删除Cell
        [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
    

    相关文章

      网友评论

          本文标题:iOS UITableView 避免删除数据越界崩溃。

          本文链接:https://www.haomeiwen.com/subject/kakdnqtx.html