美文网首页
day09-UITableView-08自定义等高的cell-纯

day09-UITableView-08自定义等高的cell-纯

作者: js_huh | 来源:发表于2019-11-10 11:56 被阅读0次

UITableView-01基本使用
UITableView-02模型优化
UITableView-03复杂的Plist解析
UITableView-04常见属性和样式
UITableView-05可重复使用Cell-有限的创建新的cell
UITableView-06可重复使用cell-注册方式
UITableView-07索引条(综合小案例)


UITableViewController-01简单使用


为什么需要自定义cell?
系统自带的cell无法满足用户的需求:
如以下需求:


怎么实现自定义cell?
  1. 准备阶段
    1.1 继承自UITableViewControler
    (1.遵循代理协议和数据源协议. 2.设置了代理和数据源对象)
    1.2 懒加载 (模型存入集合)
    1.2.1 创建模型,模型数据和plist文件的数据一一对应.
    • 2种方式将字典转换为模型
    +(instancetype)groupBuyWithDict:(NSDictionary*)dict{
    GroupBuy *groupBuy = [[self alloc] init];
    //第一种: KVO 方式赋值
    //[groupBuy setValuesForKeysWithDictionary:dict];
    //第二种: 
    groupBuy.buyCount = dict[@"buyCount"];
    ....
     return groupBuy;
    }
    
    1.2.2 加载plist文件,获取数据.
    1.2.3 字典转模型,将模型放入集合里面.
    -(NSArray *)tgData{
    if (_tgData ==nil) {
        //获取plist文件的数据
        NSArray *arrayTemp = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"tgs.plist" ofType:nil]];
        //字典转模型
        NSMutableArray *tempArray = [NSMutableArray array];
        for (NSDictionary *dict in arrayTemp) {
            GroupBuy *groupBuy = [GroupBuy groupBuyWithDict:dict];
            [tempArray addObject:groupBuy];
        }
        _tgData = tempArray;
    }
    return _tgData;
    }
    
  2. 自定义Celll
    2.1 创建继承自UITableViewCell的类
    2.2 初始化cell
    2.2.1 - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(nullable NSString *)reuseIdentifier
    外部无论采取注册方式还是直接创建的方式,它最终都是调用initWithStyle: reuseIdentifier:方法.
    2.2.2 调用父类方法,将子控件放在contentView里面.
    //自定cell的构造方法,创建cell
    - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(nullable NSString *)reuseIdentifier{
      self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
      if(self){
        //图片
        UIImageView * imgTemp = [[UIImageView alloc]init];
        [self.contentView addSubview:imgTemp];
        self.iconImageView = imgTemp;
         ....
         }
        return self;
      }
    
    2.3 设置cell的子控件的frame
    2.3.1 初始化的那个时刻,子控件还没有创建出来,所以无法确认子控件的frame.于是就有了layoutSubviews方法.
    layoutSubviews方法,是专门用于布局子控件的方法.
    2.3.2 实现父类的layoutSubviews,设置子控件的frame
    - (void)layoutSubviews{
     [super layoutSubviews];
     self.iconImageView.frame = CGRectMake(X, Y, W, H);
     }
    ....
    
    2.4 给子控件设置数据
    2.4.1 自定义的cell类里面,设置个模型属性.用来接收数据.
    2.4.2 重写set方法,set方法里面,给每个子控件设置数据.
    @property(nonatomic,strong)GroupBuy *groupBuy; //模型属性
    //给子控件添加数据
    -(void)setGroupBuy:(GroupBuy*)groupBuy{
        _groupBuy = groupBuy;
        self.titleLabel.text = groupBuy.title;
        ....
    }
    
  3. viewController里面设置cell的显示内容
static NSString *ID = @"tg";

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    //缓存池找对应的cell.
    TGCell * cell = [tableView dequeueReusableCellWithIdentifier:ID];
    if (cell == nil) {
        cell = [[TGCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
    }
    //将数据传递给重写的模型,实现给cell的子控件赋值
    cell.groupBuy = self.tgData[indexPath.row];
    return cell;
}

相关文章

网友评论

      本文标题:day09-UITableView-08自定义等高的cell-纯

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