在開發過程當中常常遇到tabView中包含多種樣式的cell,這裏介紹一種cell工廠模式 數組
下面示例中含有示圖的三種cell函數
1. 建立model基類BaseModel 和子類 OneModel TwoModel ThreeModel佈局
在BaseModel 中 建立對應modelatom
+ (instancetype)initWithDictionary:(NSDictionary *)dictionary;spa
根據字典內提供的數據分別建立出其對應的model來獲取數據orm
+ (instancetype)initWithDictionary:(NSDictionary *)dictionary {對象
先使用當前類(父類)建立出model對象開發
BaseModel *model = nil;字符串
根據字典中key對應的數據初始化不一樣的子類對象並將其返回給咱們的父類get
if ([dictionary[@"tag"]isEqualToString:@"Top News"]) {
model = [[OneModel alloc]init];
}else if ([dictionary[@"tag"]isEqualToString:@"imgextra"]) {
model = [[TwoModel alloc]init];
}else if ([dictionary[@"tag"]isEqualToString:@"music"]) {
model = [[ThreeModel alloc]init];
}
[model setValuesForKeysWithDictionary:dictionary];
return model;
}
//保護方法
-(void)setValue:(id)value forUndefinedKey:(NSString *)key {
}
2. 在viewDidLoad獲取數據
self.dataArr = [[NSMutableArray alloc]init];
//根據文件路徑獲取數據
NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"]];
//使用字典遍歷數組內的全部數據
for (NSDictionary *dict in array) {
BaseModel *model = [BaseModel initWithDictionary:dict];
//將不一樣子類建立出的model對象添加到咱們的數組當中
[self.dataArr addObject:model];
}
3. cell基類BaseModelCell 和子類OneModelCell TwoModelCell ThreeModelCell (注意cell的名字和model的關聯,下面要使用)
根據不一樣類型的model建立出不一樣的cell
+ (instancetype)initWithModel:(BaseModel *)model;
+ (instancetype)initWithModel:(BaseModel *)model
{
//根據咱們的OC函數獲取咱們的model類名並將其轉化爲OC字符串
NSString *modelName = [NSString stringWithUTF8String:object_getClassName(model)];
//使用model的類名拼接一個"Cell"來獲取到咱們的Cell類名
NSString *cellName = [modelName stringByAppendingString:@"Cell"];
//根據咱們所提供的cellName來獲取其對應的「cell子類」初始化一個cell對象返回給咱們的父類對象
//惟一標識符能夠使用咱們所提供的model來給予不一樣cell所對應的標識來重用。
BaseTableViewCell *cell = [[NSClassFromString(cellName) alloc]initWithStyle:(UITableViewCellStyleDefault)reuseIdentifier:modelName];
return cell;
}
同時, 在父類中聲明出一個BaseModel對象,在其子類裏重寫set方法,在set方法內部去作賦值的操做 在子類完成對應視圖佈局
@property (nonatomic, strong) BaseModel *baseModel;
注意:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//根據咱們的indexPath.row獲取咱們對應的model
BaseModel *baseModel = [self.dataArr objectAtIndex:indexPath.row];
//根據取出來的model獲取其對應的類名
NSString *modelName = [NSString stringWithUTF8String:object_getClassName(baseModel)];
//根據不一樣的惟一標示重用不一樣的cell
BaseTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:modelName];
//若是咱們的cell不存在
if (cell == nil) {
//根據咱們每行提供的model建立出對應的cell
//根據不一樣需求生產不一樣的產品
cell = [BaseTableViewCell initWithModel:baseModel];
}
[cell setBaseModel:baseModel];
return cell;
}