自定义UITableViewCell需注意的问题

自定义cell,有下面几种方法
方法一:
在controller的.m中

 1 @interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
 2 
 3 @property(nonatomic,strong) UITableView *tableView;
 4 
 5 @end
 6 
 7 @implementation ViewController
 8 
 9 - (void)viewDidLoad {
10     [super viewDidLoad];
11     
12     self.tableView.delegate = self;
13     self.tableView.dataSource = self;
14     
15     ///若cell内无数据,就去除多余cell
16     self.tableView.tableFooterView = [[UIView alloc]init];
17     
18     [self.view addSubview:self.tableView];
19 }
20 
21 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
22     return 10;
23 }
24 
25 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
26     static NSString *cellIdentifier = @"myCell";
27     UITableViewCell *myCell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
28     if (myCell == nil) {
29         myCell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:cellIdentifier];
30     }
31     
32     UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 320, 20)];
33     label.text = @"这个是自定义的cell";
34     [myCell addSubview:label];
35     
36     return myCell;
37 }
38 
39 -(UITableView *)tableView{
40     if (!_tableView) {
41         _tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, ViewWidth, ViewHeight)];
42     }
43     return _tableView;
44 }
45 
46 -(BOOL)prefersStatusBarHidden{
47     return YES;
48 }
49 
50 @end

这样可以实现效果,但若上下滑动时,会有几行cell字体加粗。如图:

原因在于cell复用时,由于每个服用的cell都会添加label,所以造成label的重叠。
解决问题的方法就是自定义UITableViewCell

方法二:
如想在cell里添加两个button,则需要自定义一个类,如在.h文件中,button在.h文件中定义

1 @interface ActivieyViewCell : UITableViewCell
2 /** 活动内容btn */
3 @property(nonatomic,strong) UIButton *contentBtn;
4 /** 活动花费btn */
5 @property(nonatomic,strong) UIButton *costBtn;
6 
7 /** 设置button的位置等信息 */
8 - (void)setupCellBtn;
9 @end

在.m文件中,直接在自定义方法里定义cell要添加的内容

 1 @implementation ActivieyViewCell
 2 -(void)setupCellBtn{
 3     self.contentBtn = [UIButton buttonWithType:UIButtonTypeCustom];
 4     self.contentBtn.frame = CGRectMake(10, 10, 400, 20);
 5     self.contentBtn.backgroundColor = [UIColor brownColor];
 6     [self addSubview:self.contentBtn];
 7     
 8     self.costBtn = [UIButton buttonWithType:UIButtonTypeCustom];
 9     self.costBtn.frame = CGRectMake(500, 10, 40, 20);
10     self.costBtn.backgroundColor = [UIColor lightGrayColor];
11     [self addSubview:self.costBtn];
12 }
13 @end

在tableView的cellForRowAtIndexPath中添加

 1 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
 2     static NSString *cellIdentify = @"activityList";
 3     //在该处就可以使用自定义的tableViewCell
 4     //前边的都是用
 5     //UITableViewCell *actTabCell = [tableView dequeueReusableCellWithIdentifier:cellIdentify];
 6     ActivieyViewCell *actTabCell = [tableView dequeueReusableCellWithIdentifier:cellIdentify];
 7     
 8     if (actTabCell==nil) {
 9         actTabCell = [[ActivieyViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentify];
10     } 
11 
12     //在该处定义button的位置信息等
13     [actTabCell setupCellBtn];
14     
15     [actTabCell.contentBtn setTitle:actModel.activityContent forState:UIControlStateNormal];
16     [actTabCell.contentBtn setBackgroundColor:[UIColor brownColor]];
17     actTabCell.contentBtn.titleLabel.numberOfLines = 0;
18     
19     [actTabCell.costBtn setTitle:actModel.activityCost forState:UIControlStateNormal];
20     [actTabCell.costBtn setBackgroundColor:[UIColor lightGrayColor]];
21     actTabCell.costBtn.titleLabel.numberOfLines = 0;
22     
23     return actTabCell;
24 }

这样写的好处就是tableViewCell在复用时不会出现位置混乱等bug.
但上述自定义cell的方法还有一个bug,还是cell的复用问题。点击cell时,背景有时会变乱.如图

原因还是上边的cell复用问题。改进方法是将setupCellBtn方法写到initWithStyle中,在初始化时就设置。然后在cellForRowAtIndexPath无需使用[actTabCell setupCellBtn];这样的方法

方法三:
在UITableViewCell的.m中

 1 @implementation ActivieyViewCell
 2 //重写该方法,防止复用时混乱
 3 - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
 4     self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
 5     if (self) {
 6         [self setupBtnFrame];
 7     }
 8     return self;
 9 }
10 
11 -(void)setupCellBtn{
12     self.contentBtn = [UIButton buttonWithType:UIButtonTypeCustom];
13     self.contentBtn.frame = CGRectMake(10, 10, 400, 20);
14     self.contentBtn.backgroundColor = [UIColor brownColor];
15     [self addSubview:self.contentBtn];
16     
17     self.costBtn = [UIButton buttonWithType:UIButtonTypeCustom];
18     self.costBtn.frame = CGRectMake(500, 10, 40, 20);
19     self.costBtn.backgroundColor = [UIColor lightGrayColor];
20     [self addSubview:self.costBtn];
21 }
22 @end

然后在tableView的cellForRowAtIndexPath中添加

 1 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
 2     static NSString *cellIdentify = @"activityList";
 3     //在该处就可以使用自定义的tableViewCell
 4     //前边的都是用
 5     //UITableViewCell *actTabCell = [tableView dequeueReusableCellWithIdentifier:cellIdentify];
 6     ActivieyViewCell *actTabCell = [tableView dequeueReusableCellWithIdentifier:cellIdentify];
 7     
 8     if (actTabCell==nil) {
 9         actTabCell = [[ActivieyViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentify];
10     } 
11 
12     //原来是在该处定义button的位置信息等,现在删除
13     //[actTabCell setupCellBtn];
14     
15     [actTabCell.contentBtn setTitle:actModel.activityContent forState:UIControlStateNormal];
16     [actTabCell.contentBtn setBackgroundColor:[UIColor brownColor]];
17     actTabCell.contentBtn.titleLabel.numberOfLines = 0;
18     
19     [actTabCell.costBtn setTitle:actModel.activityCost forState:UIControlStateNormal];
20     [actTabCell.costBtn setBackgroundColor:[UIColor lightGrayColor]];
21     actTabCell.costBtn.titleLabel.numberOfLines = 0;
22     
23     return actTabCell;
24 }

这样就再也不会出现重叠问题,所以推荐使用方法三,来自定义tableViewCell

原文地址:https://www.cnblogs.com/Apologize/p/4683558.html