當前應用都會比較複雜,一個tableView的列表會有多種cell,若是都放在控制器中處理,各類cell利用if,switch判斷也會達到效果,可是控制器就會變得很臃腫。其實咱們能夠利用協議來處理達到效果。而且控制中就不多的代碼 1.咱們能夠建立一個協議文件ModelConfigProtocol.hgit
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@protocol ModelConfigProtocol <NSObject>
@optional
///獲取cell的複用標識
-(NSString *)cellReuseIdentifier;
///獲取cell的高度
-(CGFloat)cellHeightWithindexPath:(NSIndexPath*)indexPath;
///點擊事件
-(void)cellDidSelectRowAtIndexPath:(NSIndexPath*)indexPath other:(_Nullable id)other;
-(UITableViewCell*)tableView:(UITableView *)tableView reuseIdenyifier:(NSString *)reusedItentifier;
@end
複製代碼
2.建立一個基類模型 BaseModel.h,而且遵照協議,實現協議方法github
#import "BaseModel.h"
@implementation BaseModel
- -(NSString *)cellReuseIdentifier {
return @"";
}
-(CGFloat)cellHeightWithindexPath:(NSIndexPath *)indexPath {
return 0.0;
}
-(void)cellDidSelectRowAtIndexPath:(NSIndexPath *)indexPath other:(id)other {
}
-(UITableViewCell*)tableView:(NSString *)tableView reuseIdenyifier:(NSString *)reusedItentifier {
UITableViewCell *cell = [[UITableViewCell alloc]init];
return cell;
}
@end
複製代碼
3.建立一個基類Cell,其他cell繼承基類Cell,而且設置遵照協議的模型爲其屬性 @property(nonatomic,strong)idmodel;swift
子類Cell重寫model的set方法,基類的cell的model的set方法實現一下,不須要作處理,真正處理的是放在子類的cell裏,根據具體事務具體分析。markdown
4.控制器中建立cell的時候就能夠不用判斷來寫了oop
-(void)viewDidLoad {
[super viewDidLoad];
AModel *modelA = [[AModel alloc]init];
BModel *bmodel = [[BModel alloc]init];
CModel *cmodel = [[CModel alloc]init];
DModel *dmodel = [[DModel alloc]init];
self.dataArray = [NSMutableArray array];
[self.dataArray addObject:modelA];
[self.dataArray addObject:bmodel];
[self.dataArray addObject:cmodel];
[self.dataArray addObject:dmodel];
self.tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
self.tableView.dataSource = self;
self.tableView.delegate = self;
self.tableView.backgroundColor = [UIColor whiteColor];
[self.view addSubview:self.tableView];
self.tableView.tableFooterView = [[UIView alloc]init];
[self.tableView reloadData];
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.dataArray.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
id <ModelConfigProtocol>model = self.dataArray[indexPath.row];
BaseCell *cell = (BaseCell *)[model tableView:tableView reuseIdenyifier:[model cellReuseIdentifier]];
cell.model = model;
return cell;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
id <ModelConfigProtocol>model = self.dataArray[indexPath.row];
return [model cellHeightWithindexPath:indexPath];
}
複製代碼
oc,swift demo地址 github.com/suifumin/Mo…ui