zoukankan      html  css  js  c++  java
  • 自定义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

  • 相关阅读:
    Tapestry5 Setup with HTML5 and jQuery
    CSS学习六:布局剖析
    CSS学习三:表格,表单,超链接和鼠标等。
    CSS+DIV实战
    一到关于c++继承和多态的题
    一道有关指针的题
    小程序,嘿嘿
    《犯罪心理》名言部分
    ethereal与wincap
    并发编程之:Lock
  • 原文地址:https://www.cnblogs.com/Apologize/p/4683558.html
Copyright © 2011-2022 走看看