美文网首页
FrameModel

FrameModel

作者: 古月思吉 | 来源:发表于2017-09-19 21:31 被阅读0次

    1.背景:
    (1)我们常常通过数据建模的形式,将原来的dictionary数据转化成model对象,并保存至数据源中,方便需要时候的数据调取(通过 .属性名 的形式就能方便调取需要的属性值)
    (2)在遇到tableView中cell高度需要自适应的情况,cell的高度需要多次计算并使用
    (3)在需要用的时候才计算,会影响效率;需要多次计算,造成重复代码太多

    2.结论:
    在获取到数据源的时候,就将各个控件的frame、cellHeight都计算出来,在需要的地方直接使用即可,不需要再计算

    3.如何创建并使用?(MVC模式)
    (1)Models:
    StatusModel.h

    @property (nonatomic ,copy)NSString * avatarimg;
    @property (nonatomic ,copy)NSString * title;
    
    +(id)modelWithDict:(NSDictionary *)dict;
    

    StatusModel.m

    +(id)modelWithDict:(NSDictionary *)dict
    {
        return [[self alloc]initWithDict:dict];
    }
    
    -(id)initWithDict:(NSDictionary *)dict
    {
        if (self=[super init]) {
            [self setValuesForKeysWithDictionary:dict];
        }
        return self;
    }
    
    -(void)setValue:(id)value forUndefinedKey:(NSString *)key
    {
    }
    

    StatusFrameModel.h

    @property (nonatomic,assign)CGRect  avatarimgImageViewF;
    @property (nonatomic,assign)CGRect  titleLabelF;
    
    @property (nonatomic ,assign)CGFloat cellHeight;
    
    @property (nonatomic ,retain) StatusModel * dataModel;
    

    (2)Views:
    StatusCell.h

    @property (nonatomic ,retain) StatusFrameModel * frameModel;
    

    StatusCell.m

    +(id)cellWithTableView:(UITableView *)tableView
    {
        NSString * ID=NSStringFromClass([self class]);
        StatusCell * cell=[tableView dequeueReusableCellWithIdentifier:ID];
        if (!cell) {
            cell=[[StatusCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
        }
        return  cell;
    }
    
    -(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
    {
        if (self=[super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
      
            /*
             创建子控件
             */
    
        }
        return self;
    }
    
    -(void)setFrameModel:(StatusFrameModel *)frameModel
    {
        _frameModel=frameModel;
        
        self.avatarimgImageView.frame=_frameModel.avatarimgImageViewF;
        self.titleLabel.frame=_frameModel.titleLabelF;
     
        [self.avatarimgImageView sd_setImageWithURL:[NSURL URLWithString:_frameModel.dataModel.avatarimg] placeholderImage:[UIImage imageNamed:@"v4_default_user_icon"]];
        self.titleLabel.text=_frameModel.dataModel.title;
    }
    

    (3)Controllers:
    ViewController.m

    //数据建模
    for (NSDictionary * dict in listArray) {
        StatusModel * model=[StatusModel modelWithDict:dict];
        StatusFrameModel * frameModel=[[StatusFrameModel alloc]init];
        frameModel.dataModel=model;
        [self.dataSource addObject:frameModel];
    }
    
    #pragma mark - UITableViewDelegate、UITableViewDataSource必须实现的三个代理方法:
    
    //返回rows
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return self.dataSource.count;
    }
    
    //返回cell
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        StatusCell * cell=[StatusCell cellWithTableView:tableView];
        cell.frameModel=self.dataSource[indexPath.row];
        return cell;
    }
    
    //返回Height
    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        StatusFrameModel * frameModel=self.dataSource[indexPath.row];
        return frameModel.cellHeight;
    }
    

    相关文章

      网友评论

          本文标题:FrameModel

          本文链接:https://www.haomeiwen.com/subject/aisfsxtx.html