iOS之Cell工廠解決多種cell的困擾

在開發過程當中常常遇到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 mainBundlepathForResource:@"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 (nonatomicstrongBaseModel *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;

}

相關文章
相關標籤/搜索