应用背景:
当所写的几个cell版式几乎一样的时候,用自定义cell比较好。
步骤:
- 在UIViewController里 定义tableView,(记得注册)然后在底下协议中定义几个数组,将每个cell的文字和图片的名称写进去
- 在UITableViewCell里,分别定义cell中都会出现的文字按钮或者图片,
- 然后就好了
UIViewController.m文件里
self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 416, 1200)];
[self.tableView registerClass:[MysuggestTableViewCell class] forCellReuseIdentifier:@"suggest"];
self.tableView.delegate = self;
self.tableView.dataSource = self;
[self.view addSubview:_tableView];
[self createUI];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
MysuggestTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"suggest" forIndexPath:indexPath];
NSArray *titileArr1 = @[@"假日",@"用户设计PK站",@"字体故事",@"板式整理术",@"水彩速绘",@"大白"];
NSArray *nameArr1 = @[@"share小白",@"share小王", @"share小吕", @"share小王",@"share小王",@"share小白"];
NSArray *timeArr1 = @[@"16分钟前", @"17分钟前", @"45分钟前", @"4小时前",@"4天前",@"7小时前"];
NSArray *imageArr1 = @[@"1-1", @"3-1-2", @"3-1-3", @"3-1-4",@"3-3-1.jpeg",@"2-2-1"];
cell.image1.image = [UIImage imageNamed:imageArr1[indexPath.section]];
cell.label1.text = titileArr1[indexPath.section];
cell.label2.text = nameArr1[indexPath.section];
cell.label3.text = timeArr1[indexPath.section];
return cell;
}
- (CGFloat)tableView: (UITableView *)tableView heightForRowAtIndexPath:(nonnull NSIndexPath *)indexPath
{
return 150;
}
//- (void)
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 6;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 1;
}
UITableViewCell.m
- (instancetype) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if([self.reuseIdentifier isEqualToString:@"suggest"]) {
_label1 = [[UILabel alloc] init];
[self.contentView addSubview:_label1];
//_label1.text = @"假日";
_label1.font = [UIFont systemFontOfSize:30];
_label2 = [[UILabel alloc] init];
[self.contentView addSubview:_label2];
//_label2.text = @"share小白";
_label1.font = [UIFont systemFontOfSize:17];
_label3 = [[UILabel alloc] init];
[self.contentView addSubview:_label3];
_label3.font = [UIFont systemFontOfSize:12];
//_label3.text = @"原创—插画-练习写作";
_label4 = [[UILabel alloc] init];
[self.contentView addSubview:_label4];
_label4.font = [UIFont systemFontOfSize:12];
//_label4.text = @"15分钟前";
// _image1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"1-1"]];
// [self.contentView addSubview:_image1];
_btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[_btn setImage:[[UIImage imageNamed:@"心.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forState:UIControlStateNormal];
_btn.titleLabel.font = [UIFont systemFontOfSize:10];
[self.contentView addSubview:_btn];
[_btn addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
_btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[_btn1 setImage:[[UIImage imageNamed:@"眼睛.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forState:UIControlStateNormal];
_btn1.titleLabel.font = [UIFont systemFontOfSize:10];
[self.contentView addSubview:_btn1];
//[_btn addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
_btn2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[_btn2 setImage:[[UIImage imageNamed:@"分享.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forState:UIControlStateNormal];
_btn2.titleLabel.font = [UIFont systemFontOfSize:10];
[self.contentView addSubview:_btn2];
//[_btn2 addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
_Zan = [[UILabel alloc] init];
_Zan.textColor = [UIColor blueColor];
_Zan.text = @"102";
_Zan.font = [UIFont systemFontOfSize:15];
[self.contentView addSubview:_Zan];
UILabel *Yan = [[UILabel alloc] init];
Yan.frame = CGRectMake(330, 120, 50, 20);
Yan.textColor = [UIColor blueColor];
Yan.text = @"23";
[self.contentView addSubview:Yan];
UILabel *Fen = [[UILabel alloc] init];
Fen.frame = CGRectMake(385, 120, 50, 20);
Fen.textColor = [UIColor blueColor];
Fen.text = @"62";
[self.contentView addSubview:Fen];
_image1 = [[UIImageView alloc] init];
[self.contentView addSubview:_image1];
}
return self;
}
- (void) layoutSubviews {
_image1.frame = CGRectMake(6, 6, 200, 120);
_label1.frame = CGRectMake(225, 15, 200, 20);
_label2.frame = CGRectMake(225, 40, 100, 15);
_label3.frame = CGRectMake(225, 60, 200, 15);
_label4.frame = CGRectMake(225, 80, 70, 15);
_btn.frame = CGRectMake(225, 115, 30, 30);
_btn1.frame = CGRectMake(295, 115, 30, 30);
_btn2.frame = CGRectMake(355, 115, 30, 30);
_Zan.frame = CGRectMake(260, 120, 50, 20);
}
- (void) click {
if(_zanSelect == NO) {
_zanSelect = YES;
_Zan.text = @"103";
}else {
_zanSelect = NO;
_Zan.text = @"102";
}
}
效果图:
但其实很多时候并不需要建自定义cell,个人觉得自定义cell很麻烦
,还要新建一个文件并且注册啥的,还有其他的几种情况:
- 当cell排版基本相同,且里面包含东西很少(一般是只有文字而且明显版本一致,都是在一个组的时候,可以不定义cell),如果有图片或者按钮,一般要定义cell,因为这就要在协议函数里面写了,定义cell本来就是问了让协议函数不要太累赘。
- 其实tableview本身就很麻烦,可以定义分组的或者不分组的。如果分组的话,其实每组板式都不同,最好自定义cell,这个时候就可麻烦,首先你要注册好几个cell。然后你得想,是每一组中的版式都不完全一样,还是有的组里基本一样,都不一样的话,你要在协议函数里写好几个if(indePath.row/section == x) 然后分别对他们写各自的排版(cell和Control里面都要写很多,分很多种。这个时候其实不自定义cell的话,只在controller里面写会更直观,缺点是很累赘,总之这个时候怎么写都很麻烦。但是如果每组中同一组的样式基本一样,cell.m里就会好写一点,而且也可以不分组,我觉得分组和不分组的差别就是在判断的时候行和列的差别。
这是我自己的一点见解和分析,如果说的不好请谅解欢迎大佬来指正。说了这么多种情况,都没有放代码,其实最好的理解办法是自己敲一遍,自己的理解很重要,但是更重要的是动手实践啊!