最先弄明白的一点:通过子类话的方法div,是子类话的UItableViewCell!
疑惑:
1,这个子类cell 和 之前的那个通过代码来自定义Cell有什么区别呢?
答:之前的通过代码自定义Cell,其原理是在系统提供的UITableViewCell类的实例的ContentView中通过添加视图控件来实现自定义Cell的,
但是值得注意的是;使用该方式时,不能再使用系统Cell实例的属性,如textLabel等,以防排版错乱,视图出现问题;归根结底还是用的系统的Cell;
而子类话cell,我们就可以实现修改Cell类的属性和布局,更加自由,但是这种方式要理清 Cell类的方法调用顺序不然很容易出现问题!
其实这两种方法配合起来使用才能达到自定义的灵活效果,单一的改变field属性是无聊僵硬的!
注意:
1,首先cell的initwithstyle中无法修改cell类属性,如cell的text label 的frame不能在cellforrow中修改,因为还会调用layoutsubviews方法;系统会重新进行排版和数据的显示,所以你在cellforrow中修改的那些field的属性也完全失效了
2,要在layoutsubviews方法中先写 【super layoutsubviews】 不然不会排版和数据显示
主要实现代码:
/**
* 初始化 将要在ContentView中添加的 “视图控件” ! 并加到ContentView上 布局和数据的设置要放在系统的layoutsubviews方法中
* 该方法要记得在 initWithStyle 或者相应的系统初始化cell的方法中调用
*/
-(void)initSubViewsInContent{
myLabel=[[UILabel alloc] initWithFrame:CGRectZero];
//尤为重要的一步 : 添加视图控件到 ContentView上
[self.contentView addSubview:myLabel];
}
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
[self initSubViewsInContent];
}
return self;
}
-(void)layoutSubviews{
[super layoutSubviews]; // 这段代码必须写!
// 修改配置 系统Cell自带控件和自定义控件!
myLabel.frame=CGRectMake(50, 10, 200, 60);
myLabel.backgroundColor=[UIColor cyanColor];
myLabel.text=self.text;
// .....其它的自定义控件修改配置....
}
还有一个值得注意的一个小点: 其实我们自己定义的控件的初始化是 可以在自定义的initsubviews方法中编辑的,说的系统会再layoutsubviews方法中重新排版是针对的系统cell的属性控件的排版,我们自定义的没有问题,其实在initsubviews方法中配置好默认的会效率更高!假如配置不是统一的,那么还是在layoutsubviews中配置好了,但分开来写还是有一定的美观和逻辑性的~~~