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;

}

相关文章
相关标签/搜索