UITableViewCell reuse good practice
Solution 1
1.It is not correct , because your cell is reused , and when it is created , it will not to go into the if-statement
, so , in the if-statement
you only need to do is to init the cell , the setText and setImage you should code outside the if-statement
.
such as :
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"NotificationViewCell";
CardViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell==nil){
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CardViewCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
cell.contentView.backgroundColor=[UIColor clearColor];
[ModelClass addSublayer:cell.contentView];
cell.cellbg.layer.cornerRadius = 8;
cell.cellbg.layer.masksToBounds = YES;
cell.cellbg.layer.borderWidth = 1;
cell.cellbg.layer.borderColor = [[UIColor grayColor] CGColor];
cell.logoImage.layer.cornerRadius = 8;
cell.logoImage.layer.masksToBounds = YES;
cell.logoImage.layer.borderWidth = 1;
cell.logoImage.layer.borderColor = [[UIColor grayColor] CGColor];
}
Merchant *merchantList= [self.cardListArr objectAtIndex:indexPath.row];
cell.nameLab.text=merchantList.name;
NSLog(@"merchantList.myloyalty.points=%@",merchantList.myloyalty.points);
// NSLog(@"memberNO=%@",merchantList.myloyalty.memberNO);
cell.integralLab.text=[NSString stringWithFormat:NSLocalizedString(@"points_dot", @"") ,[merchantList.myloyalty.points intValue]];
cell.cardNumberLab.text=[NSString stringWithFormat:@"%@%@",NSLocalizedString(@"ID", nil), merchantList.myloyalty.memberNO];
if(![ModelClass isBlankString:merchantList.introPic])
{
NSLog(@"merchantList.introPic=%@",merchantList.introPic);
[cell.logoImage setImageUrl:merchantList.introPic];
}
return cell;
}
2 Most people code like this :
if(cell==nil)
{
//init code
}
// setting code
3.If you want set the cell height , you can not code in the - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
you should code in the method of dataSource : - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
code like this :
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (index.row % 2)
return 20.0f;
return 40.0f;
}
Solution 2
I usually separate the creation and configuration of the cell into two logical parts:
- Create the cell and set up all its properties that are the same for every single cell (i.e. layout, layer)
- Write a separate
-(void)configureCell:(UITableViewCell*)cell;
function where I set up everything specific for a particular cell from the datasource (i.e. values of labels and imageView).
Then in cellForRowAtIndexPath
:
-(UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"NotificationViewCell";
CardViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell==nil){
[self createCell:&cell];
}
Mercant* mercantList = [self.cardListArr objectAtIndex:indexPath.row];
[self configureCell:cell withMercant:mercantList];
return cell;
}
-(void)createCell:(CardViewCell**)cellPtr
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CardViewCell"
owner:self
options:nil];
*cellPtr = [nib objectAtIndex:0];
CardViewCell* cell = *cellPtr;
cell.contentView.backgroundColor=[UIColor clearColor];
[ModelClass addSublayer:cell.contentView];
cell.cellbg.layer.cornerRadius = 8;
cell.cellbg.layer.masksToBounds = YES;
cell.cellbg.layer.borderWidth = 1;
cell.cellbg.layer.borderColor = [[UIColor grayColor] CGColor];
cell.logoImage.layer.cornerRadius = 8;
cell.logoImage.layer.masksToBounds = YES;
cell.logoImage.layer.borderWidth = 1;
cell.logoImage.layer.borderColor = [[UIColor grayColor] CGColor];
}
-(void)configureCell:(CardViewCell*)cell withMercant:(Mercant*)mercantList
{
cell.nameLab.text=merchantList.name;
NSLog(@"merchantList.myloyalty.points=%@",merchantList.myloyalty.points);
// NSLog(@"memberNO=%@",merchantList.myloyalty.memberNO);
cell.integralLab.text=[NSString stringWithFormat:NSLocalizedString(@"points_dot", @"") ,[merchantList.myloyalty.points intValue]];
cell.cardNumberLab.text=[NSString stringWithFormat:@"%@%@",NSLocalizedString(@"ID", nil), merchantList.myloyalty.memberNO];
if(![ModelClass isBlankString:merchantList.introPic])
{
NSLog(@"merchantList.introPic=%@",merchantList.introPic);
[cell.logoImage setImageUrl:merchantList.introPic];
}
}
Related videos on Youtube
pengwang
Updated on September 15, 2022Comments
-
pengwang over 1 year
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"NotificationViewCell"; CardViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if(cell==nil){ NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CardViewCell" owner:self options:nil]; cell = [nib objectAtIndex:0]; cell.contentView.backgroundColor=[UIColor clearColor]; [ModelClass addSublayer:cell.contentView]; cell.cellbg.layer.cornerRadius = 8; cell.cellbg.layer.masksToBounds = YES; cell.cellbg.layer.borderWidth = 1; cell.cellbg.layer.borderColor = [[UIColor grayColor] CGColor]; cell.logoImage.layer.cornerRadius = 8; cell.logoImage.layer.masksToBounds = YES; cell.logoImage.layer.borderWidth = 1; cell.logoImage.layer.borderColor = [[UIColor grayColor] CGColor]; Merchant *merchantList= [self.cardListArr objectAtIndex:indexPath.row]; cell.nameLab.text=merchantList.name; NSLog(@"merchantList.myloyalty.points=%@",merchantList.myloyalty.points); // NSLog(@"memberNO=%@",merchantList.myloyalty.memberNO); cell.integralLab.text=[NSString stringWithFormat:NSLocalizedString(@"points_dot", @"") ,[merchantList.myloyalty.points intValue]]; cell.cardNumberLab.text=[NSString stringWithFormat:@"%@%@",NSLocalizedString(@"ID", nil), merchantList.myloyalty.memberNO]; if(![ModelClass isBlankString:merchantList.introPic]) { NSLog(@"merchantList.introPic=%@",merchantList.introPic); [cell.logoImage setImageUrl:merchantList.introPic]; } } return cell; }
- i want to use the above code to reuse UITableViewCell,i donot know if it is correct,i want to get some advice.
you can see my code i use if(cell==nil),i want to know i should write what code if(cell!=nil)(if(cell==nil) else{ i should do what can improve the cell reuse})
if every cell have have same views,but have different height,for example imageview sometimes is 20 or is 40 and so on ,how to deal with the situation.
-
pengwang about 11 yearsi think you are right,i vote your post,if no other good answer i will receive it.
-
pengwang about 11 years
-
pengwang about 11 yearscan you give more code,and some -(void)configureCell:(UITableViewCell*)cell
-
pengwang about 11 yearsif every cell have have same view,but have different height,for example imageview sometimes is 20 or is 40 and so on ,how to deal with the situation.
-
MrTJ about 11 yearsin configureCell you can use
cell.frame = CGRectMake(0, 0, 320, currentHeight);
. You should also return the height of each cell intableView:heightForRowAtIndexPath: