一般使用tableView,只需要让控制器遵循UITableViewDataSource协议并成为tableView的数据源,然后设置cell就行了
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *ID = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
}
// 设置数据
cell.imageView.image = ...;
cell.textLabel.text = ...;
return cell;
}
这里直接使用的是系统自带的cell样式,并设置了重用标识
但如果想自定义cell,该如何做呢?
一般自定义控件都是重写UIView的initFrame方法,因为不管是调用对象的init方法还是initWithFrame方法都会调用initWithFrame方法。
那么是不是也能通过重写initFrame方法来自定义cell呢,我们发现初始化cell有4种方法,但是能设置重用标识的下面两种
- (id)initWithFrame:(CGRect)frame reuseIdentifier:(nullable NSString *)reuseIdentifier
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(nullable NSString *)reuseIdentifier
但是第一种已经被划掉了,所以是不建议使用的。这时我心中就有了疑惑,既然是使用initWithStyle这种方式,那么肯定是需要用系统自带的样式(因为系统自带的样式中没有custom这个选项),但是我想要用的是我自定义的cell,系统应该提供一个可以使用自定义样式的方法才对,那我就会想到用initWithFrame方法来创建,苹果为何要将这个可以顺理成章地使用自定义cell的方法划掉呢?
我按cmd点进去查看initWithframe方法的头文件,发现这样一句话
Frame is ignored. The size will be specified by the table view width and row height.
也就是说设置frame会被忽略,cell的尺寸会被规定为tableView的宽度和行高。
当然创建cell还有另外更简便的方式便是通过注册cell来简化床架cell的过程,在viewDidLoad中加入
[self.tableView registerClass:[TRStatusCell class] forCellReuseIdentifier:ID];
然后在创建cell的时候只需要写
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
通过这种方式创建的时候,系统也不会调用initWithFrame: reuseIdentifier:方法,只会调用initWithStyle: reuseIdentifier:方法
一些思考
所以想要自定义cell,重写initWithStyle: reuseIdentifier:方法就行了。但是我想苹果能不能在style中加一个像UIButton那样的custom样式,
或者提供一个比如说initWithReuseIdentifier:这样的方法,让注册创建cell的这种方式也只调用这种方法。让使用系统自带样式的cell和使用自定义的cell有不同的方式,有个明显的区分,这样能够统一整个系统代码的风格是不是更好一些,欢迎大家和我一起讨论。