Clean collection view code

objc.io #1 中有一篇是写关于table view 重用的文章——Clean table view code, 文章是提到的 clean 思路非常好能大大降低程序的耦合度,也可以让我们使用 tableView 的时候不用每次都去实现代理方法。dataSouceCell 重用,通过 Categories 去为Cell绑定数据。 懒惰乃程序员的优点,举一反三,写一篇Clean collection view code Go!

 新建项目,在storyboard中填加collection controller 

填加collection controller 后,会为collection view 指定默认的collection view cell 并且会选择默认layout 为flow layout。今天我们就以flow layout为例。 新建 SPCollectionViewController ,将collection view的 custom class 与其关联(custom class选择该类中),新建SPCollectionViewCell, 并将Collection View Cell 与其关联。 在cell 中填加label  和 imageview , (在实际应用中,拖拽需要的控件)。

 新建自定义UICollectionViewDataSource 

新建CollectionDataSource 继承自UICollectionViewDataSource用来作为collection view 的data source, 填加两个初始化方法

@property (nonatomic, strong) NSArray *items;

- (id) initWithItems:(NSArray *)anItems
      cellIdentifier:(NSString *)aCellIdentifier
    headerIdentifier:(NSString *)headerIdentifier
    footerIdentifier:(NSString *)footerIdentifier
  configureCellBlock:(CollectionViewCellConfigureBlock)configureCellBlock
configureSupplementaryBlock: (SupplementaryViewConfigureBlock)supplementaryconfigureBlock;

- (id)initWithItems:(NSArray *)anItems
     cellIdentifier:(NSString *)aCellIdentifier
 configureCellBlock:(CollectionViewCellConfigureBlock) configureCellBlock;

- (id)itemAtIndexPath:(NSIndexPath *)indexPath;




新建 两个block , 分别用来与外部的类进行数据通信, m 文件中填加delegate 方法,在cellForItemAtIndexPath indexPath 方法中通过block 来填充数据。我们将会在controller 中实现相应的block

配置UICollectionViewController

SPCollectionViewController中进行collection view初始化工作,设置其数据源为我们自定义的CollecitonDataSource 。

- (void) setupCollectionView
{
  
    CollectionViewCellConfigureBlock configrureCell = ^(id cell, id item,NSIndexPath *indexPath){
        SPCollectionViewCell *_cell = (SPCollectionViewCell *)cell;
        [_cell configureCellForVideo:item];
        
    };
    
    self.dataSource = [[CollectionDataSource alloc] initWithItems:[[DataManager shareInstance] getData] cellIdentifier:Cellidentifier configureCellBlock:configrureCell];
    
    self.collectionView.dataSource = self.dataSource;
    
}
在上面的代码中会注意到[_cell configureCellForVideo:item], 这个方法其实是在SPCollectionViewCell的一个Category中实现, 我们为了cell能够重用,将其view 的 model 层分开处理。

@implementation SPCollectionViewCell (configureForVideo)

- (void)configureCellForVideo:(Video *)video
{
    self.nameLabel.text = video.name;
    self.imageView.image = [UIImage imageNamed:@"sniper"];

}



 以上为主要的代码,完整的代码在 这里。代码中有关于header、footer的设置方法等。 CollectionDataSource 就是我们可以重用的dataSource, 在以后的使用中就不需要再去实现dataSource中那些繁琐的代理方法,只需要在自己的block进行相应的逻辑处理即可,大大提高了代码质量并且可读性增强。 

本文原创,欢迎转载指正。



你可能感兴趣的:(Clean collection view code)