美文网首页
UITableView批量插入、删除、重载Rows和Sectio

UITableView批量插入、删除、重载Rows和Sectio

作者: _10_01_ | 来源:发表于2017-12-04 10:34 被阅读244次

    UITableView 的使用可以参考iOS开发系列--UITableView全面解析

    官方文档 :https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/TableView_iPhone/ManageInsertDeleteRow/ManageInsertDeleteRow.html#//apple_ref/doc/uid/TP40007451-CH10-SW9

    批量插入和删除方法

    - (void)beginUpdates;
    - (void)endUpdates;
     
    - (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;
    - (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;
    - (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;
     
    - (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation: (UITableViewRowAnimation)animation;
    - (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation: (UITableViewRowAnimation)animation;
    - (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
    

    实际的使用示例:

    - (IBAction)insertAndDeleteRows:(id)sender {
        // original rows: Arizona, California, Delaware, New Jersey, Washington
     
        [states removeObjectAtIndex:4]; // Washington
        [states removeObjectAtIndex:2]; // Delaware
        [states insertObject:@"Alaska" atIndex:0];
        [states insertObject:@"Georgia" atIndex:3];
        [states insertObject:@"Virginia" atIndex:5];
     
        NSArray *deleteIndexPaths = [NSArray arrayWithObjects:
                                    [NSIndexPath indexPathForRow:2 inSection:0],
                                    [NSIndexPath indexPathForRow:4 inSection:0],
                                    nil];
        NSArray *insertIndexPaths = [NSArray arrayWithObjects:
                                    [NSIndexPath indexPathForRow:0 inSection:0],
                                    [NSIndexPath indexPathForRow:3 inSection:0],
                                    [NSIndexPath indexPathForRow:5 inSection:0],
                                    nil];
        UITableView *tv = (UITableView *)self.view;
     
        [tv beginUpdates];
        [tv insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationRight];
        [tv deleteRowsAtIndexPaths:deleteIndexPaths withRowAnimation:UITableViewRowAnimationFade];
        [tv endUpdates];
     
        // ending rows: Alaska, Arizona, California, Georgia, New Jersey, Virginia
    }
    

    首先需要修改UITableView的Style:

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

    使用UITableViewCellEditingStyleDelete当向左滑动时,才会出现删除按钮,
    Style有三种类型:

    typedef NS_ENUM(NSInteger, UITableViewCellEditingStyle) {
        UITableViewCellEditingStyleNone,
        UITableViewCellEditingStyleDelete,
        UITableViewCellEditingStyleInsert
    };
    

    调用删除API前需要先删除数据源里的数据

    deleteRowsAtIndexPaths操作有reload的效果,不先删除数据源里的数据将会导致异常NSInternalInconsistencyException

    [tv deleteRowsAtIndexPaths:deleteIndexPaths withRowAnimation:UITableViewRowAnimationFade];
    

    参考资料

    uitableview执行deleteRowsAtIndexPaths时出错
    UItableView中滑动删除 cell

    相关文章

      网友评论

          本文标题:UITableView批量插入、删除、重载Rows和Sectio

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