iOS——自定义cell

在写自定义cell怎么实现之前,先来看一下自定义cell的作用和用法,这一点远远比怎么实现有用的多,在进行了两天的网易云仿写后,才发现自己对自定义cell的理解完全是错的,按照我的写法来看,我的自定义cell和没有自定义没有什么区别,完全失去了写demo的意义,从明天开始重新进行网易云的仿写。

自定义cell的作用是遇到含有相同位置和控件的cell,只需要把数据添加上去,从而减少代码的含量,最好不要在自定义好cell之后再往上添加控件,这样就失去了自定义的意义。

1.先来看看cell两种复用方式:

非注册
-(id)dequeueReusableCellWithIdentifier:(NSString *)identifier;
如果没有复用cell,程序可能会返回nil, 所以创建完cell后必须要做判空处理,未获取到则重新创建。

UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:@"iOS"];
        
    //判空
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"iOS"];
    }
  • 注册
    (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath;
    获取复用的cell,如果没有复用的cell,将自动使用提供的class类创建新的cell并返回。
[self.tableView registerClass:[MyTableViewCell class] forCellReuseIdentifier:@"iOS"];

MyTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"iOS" forIndexPath:indexPath];

区别:注册之后就不需要再判断cell是否为nil,在初始化cell的过程中已经进行了此操作。

2.自定义cell的实现

1.首先创建一个类,这个类继承于UITableViewCell这个类,然后在.h文件里添加这个cell需要的控件(一经添加,后面就不要修改了):

@interface MYTableViewCell : UITableViewCell

@property (nonatomic, strong) UILabel *label;
@property (nonatomic, strong) UIImageView *imageview;

@end

然后在.m文件里要实现两个函数:

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {

}
- (void)layoutSubviews {

}

第一个函数用于对h文件里的控件及cell进行初始化,下面的函数用实现控件位置,在这个函数里也可以对控件添加其他方法或改变属性,但是不建议这么做,这么搞得话就失去了自定义的意义,切记这里面添加的都是固有的属性,如果在后面要用到的cell都有这些属性就可添加,否则别添加。
例:

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    
    self.label = [[UILabel alloc] init];
    [self.contentView addSubview: self.label];

    self.imageview = [[UIImageView alloc] init];
    [self.contentView addSubview: _imageview];
    
    return self;
}
- (void)layoutSubviews {

    _label.frame = CGRectMake(30, 10, 100, 50);

    
    _imageview.frame = CGRectMake(100, 10, 50, 50);

}

结果:

dead cells恢复内购ios ios dead cells_dead cells恢复内购ios

最后,自定义cell的作用一定是让项目变的简单,简洁明了,如果在写自定义cell的时候发现还不如不自定义,那可能是方法错了。
今天一下午都在研究复用问题,就是自定义cell的用法出错,不仅两天的demo基本全错,还险些走错了方向,吃一堑长一智,这个教训让我对自定义cell恨之入骨,以至于以后都不会忘,衷心建议大家写demo之前一定不要着急,一定要研究清楚了再动手。