美文网首页
iOS UICollectionViewController的c

iOS UICollectionViewController的c

作者: 山杨 | 来源:发表于2017-02-16 15:58 被阅读387次
    - (void)insertItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;
    - (void)deleteItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;
    - (void)reloadItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;
    - (void)moveItemAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath;
    
    - (void)performBatchUpdates:(void (^ __nullable)(void))updates completion:(void (^ __nullable)(BOOL finished))completion;
    

    最近的一个项目中用到了UICollectionViewController, 当然也遇到很多坑, 在执行插入/删除/刷新.etc操作的过程中, 一不小心程序就会crash掉.

    例: 带动画的 插入操作
    
    /**
     数据源数组
     */
    @property (nonatomic, strong) NSMutableArray *dataSource;
    
    #pragma mark - <UICollectionViewDataSource>
    - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
        // 每次执行完插入操作之后,增加cell, 都会直接通过数组元素的增加直接得到刷新
        return self.dataSource.count;
    }
    
    插入操作
    NSMutableArray<NSIndexPath *> *insertData 为需要插入的 NSIndexPath 对象数组
    [self.collectionView performBatchUpdates:^{
        // 在执行完插入的操作之后, 紧接着会调用UICollectionViewController的数据源方法:collectionView: numberOfItemsInSection:
        [self.collectionView insertItemsAtIndexPaths:insertData];
    
        // 此时如果collectionView: numberOfItemsInSection:返回的数据数量没有及时刷新,程序就会crash掉
        [self.dataSource addObjectsFromArray: insertData];
    } completion:^(BOOL finished) {
                
        // 在此执行插入操作完成后的代码
    }];
    以上操作少一步都会crash掉
    
    

    插入/删除/刷新.etc操作都几乎一样, 可以举一反三了😁

    总结:

    在执行插入/删除/刷新.etc操作后, 一定要及时刷新数据源

    相关文章

      网友评论

          本文标题:iOS UICollectionViewController的c

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