关于自定义tableViewCell的思考

一般使用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有不同的方式,有个明显的区分,这样能够统一整个系统代码的风格是不是更好一些,欢迎大家和我一起讨论。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容