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