---恢复内容开始---
封装Button ,封装UITableView,封装UICollectionView:
1.实现Button的创建和点击事件不用分开操作处理;
2.实现UITableView的代理数据源方法不用分开操作;
3.实现UICollectionView的代理数据源方法不用分开操作;
实现如下 :
Button的实现 :
- (void)viewDidLoad{ [super viewDidLoad]; self.view.backgroundColor = [UIColor groupTableViewBackgroundColor]; ZH_Button *button = [[ZH_Button alloc]initWithFrame:CGRectMake(100, 100, 100, 50) normalImageString:nil highlightImageString:nil]; [button setTitle:@"哈哈" forState:UIControlStateNormal]; button.backgroundColor = [UIColor redColor]; [button addActionforControlEvents:UIControlEventTouchUpInside respond:^{ NSLog(@"我被点了"); }]; [self.view addSubview:button]; }
UITableView的实现:
- (void)viewDidLoad { [super viewDidLoad]; [self loadData]; [self createTableView]; } - (void)loadData{ NSArray *dataArray = @[@"思思1",@"思思2",@"思思3",@"思思4",@"思思5",@"思思6",@"思思7",@"思思8",@"思思9",@"思思10",@"思思11"]; self.dataSources = [dataArray mutableCopy]; } - (void)createTableView{ _myTableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain]; [self.view addSubview:self.myTableView]; // 注册cell [_myTableView registerClass:[MyCell class] forCellReuseIdentifier:identifier]; self.dataArray = [[ArrayDataSource alloc]initWithItems:self.dataSources cellIdentifier:identifier configureCellBlock:^(MyCell *cell, id item) { cell.title = item; } itemHeight:70]; self.myTableView.dataSource = self.dataArray; self.myTableView.delegate = self.dataArray; __weak typeof(self)weakSelf = self; self.dataArray.didSelect = ^ (NSIndexPath *indexPath){ NSString *title = weakSelf.dataSources[indexPath.row]; NSLog(@"选择的行:indexPath = %@,标题为 : %@",indexPath,title); }; self.dataArray.didDeselectRow = ^ (NSIndexPath *indexPath){ NSLog(@"取消选择行: %@",indexPath); }; self.dataArray.didHighlight = ^ (NSIndexPath *indexPath){ NSLog(@"高亮行: %@",indexPath); }; }
UICollectionView的实现 :
- (void)viewDidLoad{ self.view.backgroundColor = [UIColor groupTableViewBackgroundColor]; [super viewDidLoad]; [self loadData]; [self createCollectionView]; } #pragma mark - createCollectionView - (void)createCollectionView{ UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init]; layout.itemSize = CGSizeMake(70, 70); self.myCollectionView = [[UICollectionView alloc]initWithFrame:self.view.bounds collectionViewLayout:layout]; self.myCollectionView.backgroundColor = [UIColor clearColor]; // 注册cell [self.myCollectionView registerClass:[MyCollectionCell class] forCellWithReuseIdentifier:identifier]; // 设置数据源,代理 self.dataSourceArray = [[CollectionViewDataSource alloc]initWithItems:self.dataArray cellIdentifier:identifier configureCellBlock:^(MyCollectionCell *cell, id item) { cell.title = item; } itemSize:CGSizeMake(70, 70)]; self.myCollectionView.dataSource = self.dataSourceArray; self.myCollectionView.delegate = self.dataSourceArray; [self.view addSubview:self.myCollectionView]; __weak typeof(self) weakSelf = self; self.dataSourceArray.didSelect = ^ (NSIndexPath *indexPath){ NSString *title = weakSelf.dataArray[indexPath.row]; NSLog(@"选择的item:indexPath = %@,标题为 : %@",indexPath,title); }; self.dataSourceArray.didDeselectRow = ^ (NSIndexPath *indexPath){ NSLog(@"取消选择item: %@",indexPath); }; self.dataSourceArray.didHighlight = ^ (NSIndexPath *indexPath){ NSLog(@"高亮item: %@",indexPath); }; } - (void)loadData{ NSArray *dataArray = @[@"思思1",@"思思2",@"思思3",@"思思4",@"思思5",@"思思6",@"思思7",@"思思8",@"思思9",@"思思10",@"思思11"]; self.dataArray = dataArray; }
具体的中间的封装:
1.Button的封装:
typedef void(^DGCompletionHandler)(void); #import <UIKit/UIKit.h> @interface ZH_Button : UIButton // 按钮触发 - (void)addActionforControlEvents:(UIControlEvents)controlEvents respond:(DGCompletionHandler)completion; // 初始化 -(instancetype)initWithFrame:(CGRect)frame normalImageString:(NSString *)normalImageString highlightImageString:(NSString *)highlightImageString;
#import "ZH_Button.h" #import <objc/runtime.h> static void *BuClickKey = @"BuClickKey"; @implementation ZH_Button -(instancetype)initWithFrame:(CGRect)frame normalImageString:(NSString *)normalImageString highlightImageString:(NSString *)highlightImageString{ if (self = [super initWithFrame:frame]) { self = [ZH_Button buttonWithType:UIButtonTypeCustom]; self.frame = frame; if (normalImageString) { [self setImage:[UIImage imageNamed:normalImageString] forState:UIControlStateNormal]; } if (highlightImageString) { [self setImage:[UIImage imageNamed:highlightImageString] forState:UIControlStateHighlighted]; } } return self; } - (void)addActionforControlEvents:(UIControlEvents)controlEvents respond:(DGCompletionHandler)completion{ [self addTarget:self action:@selector(didClickBU) forControlEvents:controlEvents]; void (^block)(void) = ^{ completion(); }; objc_setAssociatedObject(self, BuClickKey, block, OBJC_ASSOCIATION_COPY); } -(void)didClickBU{ void (^block)(void) = objc_getAssociatedObject(self, BuClickKey); block(); }
2.UITableView的封装:
#import <Foundation/Foundation.h> #import <UIKit/UIKit.h> // 导入ArrayDataSource记得要导入UIKit框架,否则可能报错哟!!! typedef void (^shouldHighlight)(NSIndexPath*); typedef void (^didSelect)(NSIndexPath *indexPath); typedef void (^didHighlight)(NSIndexPath *indexPath); typedef void (^didDeselectRow)(NSIndexPath *indexPath); typedef void (^TableViewCellConfigureBlock)(id cell, id item); @interface ArrayDataSource : NSObject <UITableViewDataSource,UITableViewDelegate> @property(nonatomic,copy)didSelect didSelect; @property(nonatomic,copy)didHighlight didHighlight; @property(nonatomic,strong)shouldHighlight shouldHighlight; @property(nonatomic,strong)didDeselectRow didDeselectRow; - (id)initWithItems:(NSArray *)anItems cellIdentifier:(NSString *)aCellIdentifier configureCellBlock:(TableViewCellConfigureBlock)aConfigureCellBlock itemHeight:(float)itemHeight; - (id)itemAtIndexPath:(NSIndexPath *)indexPath; @end
#import "ArrayDataSource.h" @interface ArrayDataSource () @property (nonatomic, strong) NSArray *items; @property (nonatomic, copy) NSString *cellIdentifier; @property(nonatomic, assign)float itemHeight; @property (nonatomic, copy) TableViewCellConfigureBlock configureCellBlock; @end @implementation ArrayDataSource #pragma mark - Init - (id)init { return nil; } - (id)initWithItems:(NSArray *)anItems cellIdentifier:(NSString *)aCellIdentifier configureCellBlock:(TableViewCellConfigureBlock)aConfigureCellBlock itemHeight:(float)itemHeight { self = [super init]; if (self) { self.items = anItems; self.cellIdentifier = aCellIdentifier; self.configureCellBlock = [aConfigureCellBlock copy]; self.itemHeight = itemHeight; } return self; } - (id)itemAtIndexPath:(NSIndexPath *)indexPath { return self.items[(NSUInteger) indexPath.row]; } #pragma mark UITableView Delegate -(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath{ if (self.didHighlight) { self.didHighlight(indexPath); } } -(BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath{ if (self.shouldHighlight) { self.shouldHighlight(indexPath); } return YES; } -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ return self.itemHeight; } -(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{ if (self.didDeselectRow) { self.didDeselectRow(indexPath); } } -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ if (self.didSelect) { self.didSelect(indexPath); } } #pragma mark - UITableView DataSource - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (self.items.count == 0) { NSLog(@"什么鬼"); } return self.items.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:self.cellIdentifier]; if (!cell) { cell = [tableView dequeueReusableCellWithIdentifier:self.cellIdentifier forIndexPath:indexPath]; } id item = [self itemAtIndexPath:indexPath]; if (self.configureCellBlock) { self.configureCellBlock(cell, item); } return cell; }
3.UICollectionView的封装:
#import <Foundation/Foundation.h> #import <UIKit/UIKit.h> /** 数据源,代理回调block*/ typedef void (^shouldHighlight)(NSIndexPath*); typedef void (^didSelect)(NSIndexPath *indexPath); typedef void (^didHighlight)(NSIndexPath *indexPath); typedef void (^didDeselectRow)(NSIndexPath *indexPath); typedef void (^CollectionViewCellConfigureBlock)(id cell, id item); @interface CollectionViewDataSource : NSObject<UICollectionViewDelegate,UICollectionViewDataSource> @property(nonatomic,copy)didSelect didSelect; @property(nonatomic,copy)didHighlight didHighlight; @property(nonatomic,strong)shouldHighlight shouldHighlight; @property(nonatomic,strong)didDeselectRow didDeselectRow; // 初始化方法 - (id)initWithItems:(NSArray *)anItems cellIdentifier:(NSString *)aCellIdentifier configureCellBlock:(CollectionViewCellConfigureBlock)aConfigureCellBlock itemSize:(CGSize)itemSize; // 根据indexPath取得对应的item - (id)itemAtIndexPath:(NSIndexPath *)indexPath; @end
#import "CollectionViewDataSource.h" @interface CollectionViewDataSource () @property (nonatomic, strong) NSArray *items; @property (nonatomic, copy) NSString *cellIdentifier; @property(nonatomic,assign)CGSize itemSize; @property (nonatomic, copy) CollectionViewCellConfigureBlock configureCellBlock; @end @implementation CollectionViewDataSource #pragma mark - Init - (instancetype)init{ return nil; } - (id)initWithItems:(NSArray *)anItems cellIdentifier:(NSString *)aCellIdentifier configureCellBlock:(CollectionViewCellConfigureBlock)aConfigureCellBlock itemSize:(CGSize)itemSize { self = [super init]; if (self) { self.items = anItems; self.cellIdentifier = aCellIdentifier; self.configureCellBlock = [aConfigureCellBlock copy]; self.itemSize = itemSize; } return self; } - (id)itemAtIndexPath:(NSIndexPath *)indexPath { return self.items[(NSUInteger) indexPath.row]; } #pragma mark - UICollectionView DataSource - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ if (self.items.count == 0) { NSLog(@"数组为空啦!!!"); } return self.items.count; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:self.cellIdentifier forIndexPath:indexPath]; if (!cell) { cell = [[UICollectionViewCell alloc]init]; } id item = [self itemAtIndexPath:indexPath]; if (self.configureCellBlock) { self.configureCellBlock(cell,item); } return cell; } #pragma mark - UICollectionView Delegate - (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath{ if (self.didDeselectRow) { self.didDeselectRow(indexPath); } } - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ if (self.didSelect) { self.didSelect(indexPath); } } - (void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath{ if (self.didHighlight) { self.didHighlight(indexPath); } } //定义每个UICollectionView 的大小 - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { return self.itemSize; } @end
---恢复内容结束---