自定义cell

.创建模型类

1.属性

@interface Model : NSObject

@property(nonatomic, copy)NSString *name;

@property(nonatomic, copy)NSString *gender;

// 记录是否被选中

@property(nonatomic, assign)BOOL isSelect;

@end

 

  创建cell。引入模型的头文件

@interface MyTableViewCell : UITableViewCell

// 在此声明控件属性 是为了方便 在控制器中 能够访问到 自定义cell中的控件

@property(nonatomic, retain)UILabel *nameLabel;

@property(nonatomic, retain)UILabel *genderLabel;

@property(nonatomic, retain)UIButton *button;

// 此方法用于接收controller传进来的model

// 在此方法中 model的值 赋值给控件

- (void)cellConfigureModel:(Model *)model;

@end

 

 

/ 自定义cell中的 初始化方法

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

{

    // 在自定义方法中 我们需要做的事情是初始化控件 以及空间之间的布局

    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

    if (self)

    {

        // 我们自定义cell的所有控件 都是要加载到cellcontentView上的

        self.nameLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, 100, 30)];

        self.nameLabel.backgroundColor = [UIColor magentaColor];

        [self.contentView addSubview:_nameLabel];

        [_nameLabel release];

        

        self.genderLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, 50, 100, 30)];

        self.genderLabel.backgroundColor = [UIColor cyanColor];

        [self.contentView addSubview:_genderLabel];

        [_genderLabel release];

        

        self.button = [UIButton buttonWithType:UIButtonTypeSystem];

        self.button.frame = CGRectMake(150, 10, 100, 30);

        [self.button setTitle:@"选择" forState:UIControlStateNormal];

        [self.contentView addSubview:_button];

        [_button release];

    }

    return self;

}

// 在此方法中 model的值 赋值给控件

- (void)cellConfigureModel:(Model *)model

{

    self.nameLabel.text = model.name;

    self.genderLabel.text = model.gender;

}

- (void)awakeFromNib {

    // Initialization code

}

 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {

    [super setSelected:selected animated:animated];

 

    // Configure the view for the selected state

}

 

@end

 

 

//ViewControll要自己写创建cell的方法,而UIViewCellControll自带方法

@interface RootViewController ()<UITableViewDataSource, UITableViewDelegate>

@property(nonatomic, retain)UITableView *tableView;

@property(nonatomic, retain)NSMutableArray *modelArray;

@end

static NSString *cellIndentifier = @"cell";

@implementation RootViewController

- (void)dealloc

{

    [_tableView release];

    [_modelArray release];

    [super dealloc];

}

 

- (void)setModel

{

    self.modelArray = [NSMutableArray array];

    for (int i = 0; i < 10; i++)

    {

        Model *model = [[Model alloc]init];

        model.name = [NSString stringWithFormat:@"哈哈%d",i];

        if (i % 2 == 0)

        {

            model.gender = @"";

        }

        else

            model.gender = @"";

        [self.modelArray addObject:model];

        [model release];

 

    }

}

- (void)viewDidLoad {

    [super viewDidLoad];

    [self setModel];

 

    // Do any additional setup after loading the view.

    self.navigationController.navigationBar.translucent = NO;

    self.navigationItem.title = @"自定义cell";

    self.tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, 375, 667 - 64) style:UITableViewStylePlain];

    self.tableView.dataSource = self;

    self.tableView.delegate = self;

    

    // 注册自定义cell 每次一自定义 就先给注册上

    [self.tableView registerClass:[MyTableViewCell class] forCellReuseIdentifier:cellIndentifier];

    

    [self.view addSubview:_tableView];

    [_tableView release];

}

 

#pragma mark ---- 返回多少分区 ---

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

{

    return 1;

}

#pragma mark --- 每个分区下返回多少行 ---

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

    return self.modelArray.count;

}

#pragma mark --- 返回cell的方法 ---

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

    // 普通的自定义cell写法

    /*

    static NSString *cellIndentifier = @"cell";

    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIndentifier];

    if (cell == nil)

    {

        cell = [[[MyTableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIndentifier]autorelease];

    }

    Model *model = self.modelArray[indexPath.row];

    cell.nameLabel.text = model.name;

    cell.genderLabel.text = model.gender;

     return cell;

     */

    // 不用判断 直接用下面的方法自定义cell注册的写法 tableView必须注册一个cell

    // 切记cell的标识要和注册时给的一样 否则会导致崩溃

    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIndentifier forIndexPath:indexPath];

    Model *model = self.modelArray[indexPath.row];

    // 传进来一个model cell类的内部进行赋值控件

    [cell cellConfigureModel:model];

    

    // cell 上的每个 button 添加触发方法

    [cell.button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];

    // indexPath.row作为buttontag

    // button的触发方法中 我们需要要用到tag值寻找对应的model

    cell.button.tag = 100 + indexPath.row;

    

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    

    if (model.isSelect == YES)

    {

        cell.backgroundColor = [UIColor orangeColor];

        [cell.button setTitle:@"取消" forState:UIControlStateNormal];

 

    }

    else

    {

        cell.backgroundColor = [UIColor clearColor];

        [cell.button setTitle:@"选择" forState:UIControlStateNormal];

    }

 

    return cell;

 

}

#pragma mark --- button的触发方法 ---

- (void)buttonAction:(UIButton *)button

{

    // 找到当前Model

    Model *model = self.modelArray[button.tag - 100];

    // 找到对应的cell

    MyTableViewCell *cell =(MyTableViewCell *)button.superview.superview      ;

    NSString *title = [button titleForState:UIControlStateNormal];

    if ([title isEqualToString:@"选择"])

    {

        // model置成选中状态

        model.isSelect = YES;

        cell.backgroundColor = [UIColor orangeColor];

        [cell.button setTitle:@"取消" forState:UIControlStateNormal];

    }

    else

    {

        cell.backgroundColor = [UIColor clearColor];

        [cell.button setTitle:@"选择" forState:UIControlStateNormal];

 

    }

    

}

#pragma mark --- 返回每行的高度 ---

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

{

    return 200;

}

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

 

 

 

@end

 

posted @ 2016-02-23 20:58  mingxing  阅读(314)  评论(0编辑  收藏  举报