如何使用UItableViewCell reuseIdentifier

我想使用UITableviewCell重用,我有一个自定义的UITableViewCell和使用ARC,我的UITableViewCell是不同的。 我的代码是:

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { PostCount *post=[listArr objectAtIndex:indexPath.row]; static NSString *CellIdentifier = @"TimeLineViewCell"; TimeLineViewCell *cell = (TimeLineViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if(cell==nil){ cell = [[TimeLineViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellIdentifier11"]; } cell.tag=indexPath.row+1000; cell.lab_time.text=[ModelClass intervalSinceNow:post.when btime:0]; cell.delegate=self; [cell setViewStyle:post]; post=nil; return cell; } 

你知道我是否使用

 cell = [[TimeLineViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] 

代替

 cell = [[TimeLineViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellIdentifier11"]; 

我的牢房总是在错误的位置。 为什么我不能使用相同的重用reuseIdentifier 。 如果我使用不同的重用标识符,如果我的单元格不重用。

对于其他ViewController视图,当单元格的高度相同时,我使用相同的reuseIdentifier一切正常。 有人可以帮我解决这个问题吗?

编辑:我的自定义单元格代码:

 #import "TimeLineViewCell.h" @implementation TimeLineViewCell - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { imageView_t=[[UIImageView alloc]initWithFrame:CGRectMake(5, 5, 40, 40)]; imageView_t.hidden=YES; imageIcon=[[UIImageView alloc]initWithFrame:CGRectMake(295, 5, 16, 16)]; self.lab_time = [[UILabel alloc] initWithFrame:CGRectMake(210, 5, 80, 20)]; self.lab_time.textColor=[UIColor grayColor]; self.lab_time.font=[UIFont systemFontOfSize:12]; self.lab_time.textAlignment=UITextAlignmentRight; self.lab_time.backgroundColor=[UIColor clearColor]; whoscreenName = [[UILabel alloc] initWithFrame:CGRectMake(60, 5, 145, 20)]; whoscreenName.textColor=[UIColor blackColor]; whoscreenName.font=[UIFont systemFontOfSize:18]; whoscreenName.lineBreakMode = UILineBreakModeTailTruncation; whoscreenName.numberOfLines = 0; whoscreenName.backgroundColor=[UIColor clearColor]; myWhat = [[UITextView alloc] init]; myWhat.textColor=[UIColor blackColor]; myWhat.backgroundColor=[UIColor clearColor]; [myWhat setScrollEnabled:NO]; [myWhat setEditable:NO]; myWhat.dataDetectorTypes=UIDataDetectorTypeLink; [myWhat setCanCancelContentTouches:NO]; self.myWhaticon=[[UIView alloc]init]; myImageView=[[UIImageView alloc]init]; myImageView.hidden=YES; myIndicatorView=[[UIActivityIndicatorView alloc ]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; myIndicatorView.hidden=YES; whoBgView=[[UIImageView alloc]init]; whoBgView.image = [[UIImage imageNamed:@"timeline_rt_border_t.png"] stretchableImageWithLeftCapWidth:130 topCapHeight:7]; whoWhat = [[UITextView alloc] init]; whoWhat.textColor=[UIColor blackColor]; whoWhat.backgroundColor=[UIColor clearColor]; [whoWhat setScrollEnabled:NO]; [whoWhat setEditable:NO]; whoWhat.dataDetectorTypes=UIDataDetectorTypeLink;//url [whoWhat setCanCancelContentTouches:NO]; whoImageView=[[UIImageView alloc]init]; whoImageView.hidden=YES; activityIndicatorView=[[UIActivityIndicatorView alloc ]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; activityIndicatorView.hidden=YES; myWhat.font=[UIFont systemFontOfSize:15]; whoWhat.font=[UIFont systemFontOfSize:14]; } return self; } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; // Configure the view for the selected state } - (void)layoutSubviews { [super layoutSubviews]; [self addSubview:imageView_t]; [self addSubview:imageIcon]; [self addSubview: self.lab_time]; [self addSubview:whoscreenName]; [self addSubview:myWhat]; [self addSubview:self.myWhaticon]; [self addSubview:myImageView]; [self addSubview:myIndicatorView]; [self addSubview:whoBgView]; [whoBgView addSubview:whoWhat]; [whoBgView addSubview:whoImageView]; [whoBgView addSubview: activityIndicatorView]; whoImageView=nil; whoWhat=nil; } -(void)my_imag_btnClick:(UIButton *)btn{ [self.delegate my_imag_btnClick:btn.tag]; } -(void)who_imag_btnClick:(UIButton *)btn{ NSLog(@"who_imag_btnClick"); [self.delegate who_imag_btnClick:btn.tag]; } - (void)dealloc { imageView_t.image=nil; imageView_t=nil; imageIcon.image=nil; imageIcon=nil; whoscreenName=nil; self.lab_time=nil; whoscreenName=nil; myWhat=nil; self.myWhaticon=nil; myImageView.image=nil; myImageView=nil; whoBgView.image=nil; whoBgView=nil; whoImageView.image=nil; whoImageView=nil; } -(void)setViewStyle:(PostCount *)post{ //时间if (self.btime==1) { self.lab_time.text=[ModelClass intervalSinceNow:post.when btime:1 ]; }else{ self.lab_time.text=[ModelClass intervalSinceNow:post.when btime:0]; } imageView_t.hidden=NO; // imageView_t.isRoundIcon=YES; imageView_t.layer.cornerRadius = 5; imageView_t.layer.masksToBounds = YES; //给图层添加一个有色边框imageView_t.layer.borderWidth = 0.8; imageView_t.layer.borderColor = [[UIColor colorWithRed:230.0/255 green:230.0/255 blue:230.0/255 alpha:1.0] CGColor]; if(![GlobalVariable isBlankString:post.who.avatarbig]) { [imageView_t setImageWithURL:[NSURL URLWithString:post.who.avatarbig] placeholderImage:[UIImage imageNamed:@"default_user.png"]]; } else{ imageView_t.image=[UIImage imageNamed:@"default_user.png"]; } //icon imageIcon.image=[UIImage imageNamed:[ModelClass returnimage_source:post.source]]; whoscreenName.text=post.who.screenName; CGSize size_myWhat =[ModelClass heightForTextView:[UIFont systemFontOfSize:15] WithText:post.what weith:250]; myWhat.frame=CGRectMake(50, 25, 250, size_myWhat.height); myWhat.text=[NSString stringWithFormat:@"%@",post.what]; self.myWhaticon.frame=myWhat.frame; if(![GlobalVariable isBlankString:post.img_small]) { CGSize size_myImageView=CGSizeMake(80, 80); myImageView.frame=CGRectMake(50, 30+size_myWhat.height, size_myImageView.width, 80); myImageView.hidden=NO; myIndicatorView.center=myImageView.center; myIndicatorView.hidden=NO; [myIndicatorView startAnimating]; __block UIActivityIndicatorView *indicatorView=myIndicatorView; __block UIImageView *myImage = myImageView; [myImageView setImageWithURL:[NSURL URLWithString:post.img_small] placeholderImage:nil success:^(UIImage *image){ CGRect sFrame=myImage.frame; //缩放CGSize newSize=image.size; if (newSize.height>80) { newSize.height=80; newSize.width=newSize.width*80.0/image.size.height; }else{ if (newSize.width>80) { newSize.height=newSize.height *80.0/image.size.width; newSize.width=80; }else{//2个都小于80 newSize.height=newSize.height; newSize.width=newSize.width; } } sFrame.size=newSize; myImage.frame=sFrame; indicatorView.hidden=YES; [indicatorView stopAnimating]; [indicatorView removeFromSuperview]; } failure:^(NSError *error){ indicatorView.hidden=YES; [indicatorView stopAnimating]; [indicatorView removeFromSuperview]; }]; UIButton * myImageBtn=[[UIButton alloc]init]; myImageBtn.frame= CGRectMake(50, 30+size_myWhat.height, size_myImageView.width, 80); [myImageBtn addTarget:self action:@selector(my_imag_btnClick:) forControlEvents:UIControlEventTouchUpInside]; myImageBtn.tag=self.tag-1000; // myImageBtn.backgroundColor=[UIColor blueColor]; [self addSubview:myImageBtn ]; } if ([post.sourceTweet.what length]>0) { whoWhat.text=[NSString stringWithFormat:@"@%@: %@",post.sourceTweet.who.screenName,post.sourceTweet.what]; } CGSize size_whoWhat =[ModelClass heightForTextView:[UIFont systemFontOfSize:14] WithText:whoWhat.text weith:250]; whoWhat.frame=CGRectMake(10, 10, 250, size_whoWhat.height); if(![GlobalVariable isBlankString:post.sourceTweet.img_small]) { CGSize size_whoImageView=CGSizeMake(80, 80); whoImageView.frame=CGRectMake(30, 15+size_whoWhat.height, size_whoImageView.width, 80); whoImageView.hidden=NO; activityIndicatorView.center=whoImageView.center; activityIndicatorView.hidden=NO; [activityIndicatorView startAnimating]; __block UIActivityIndicatorView *indicatorView = activityIndicatorView; __block UIImageView *whoImage = whoImageView; [whoImageView setImageWithURL:[NSURL URLWithString:post.sourceTweet.img_small] placeholderImage:nil success:^(UIImage *image){ CGRect sFrame=whoImage.frame; //缩放CGSize newSize=image.size; if (newSize.height>80) { newSize.height=80; newSize.width=newSize.width*80.0/image.size.height; }else{ if (newSize.width>80) { newSize.height=newSize.height *80.0/image.size.width; newSize.width=80; }else{//2个都小于80 newSize.height=newSize.height; newSize.width=newSize.width; } } sFrame.size=newSize; whoImage.frame=sFrame; indicatorView.hidden=YES; [indicatorView stopAnimating]; [indicatorView removeFromSuperview]; } failure:^(NSError *error){ indicatorView.hidden=YES; [indicatorView stopAnimating]; [indicatorView removeFromSuperview]; }]; UIButton * whoImageBtn=[[UIButton alloc]init]; int myimageHeight=0; if (myImageView.frame.size.height>0) { myimageHeight=5+80; } whoImageBtn.frame=CGRectMake(30+42, 40+size_myWhat.height+size_whoWhat.height+myimageHeight, 80, 80); whoImageBtn.backgroundColor=[UIColor clearColor]; [whoImageBtn addTarget:self action:@selector(who_imag_btnClick:) forControlEvents:UIControlEventTouchUpInside]; whoImageBtn.tag=self.tag-1000; [self addSubview:whoImageBtn ]; } if (size_whoWhat.height<20) { whoBgView.hidden=YES; }else{ int myimageHeight=0; if (myImageView.frame.size.height>0) { myimageHeight=5+80; } whoBgView.frame=CGRectMake(42, 25+size_myWhat.height+myimageHeight, 270, 20+size_whoWhat.height+whoImageView.frame.size.height); } } @end 

要么不重复使用这些单元格,要么给每个单元一个自定义标识符。

对于自定义标识符,请replace为:

 static NSString *CellIdentifier = @"TimeLineViewCell"; TimeLineViewCell *cell = (TimeLineViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if(cell==nil){ cell = [[TimeLineViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellIdentifier11"]; } 

有了这个:

 TimeLineViewCell *cell = (TimeLineViewCell*)[tableView dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"%i", indexPath.row]]; if(cell==nil){ cell = [[TimeLineViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[NSString stringWithFormat:@"%i", indexPath.row]]; } 

否则,只是不要出队,每次创build一个新的单元格。

注意:基于单元格indexPath.row的自定义标识符只有在用户没有进行表编辑的情况下才能使用。 如果他们将编辑表格,不要重复使用单元格。

实现- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath as @Sean提到。 应该是这样的:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return [self calculateRowHeighForIndexPath:indexPath]; } - (CGFloat)calculateRowHeighForIndexPath:(NSIndexPath *)indexPath { //return height of corresponding image here } 

@Praveen提供的博客有正确的答案。 你必须执行下面的方法@Sean D.提到:

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

这是设置TableViewCells高度的正确方法。 您必须根据单元格的内容来确定行的高度。 正如你所知道的indexPath,你可以通过indexPath.row确定每一行的高度

我下面的方式重用UITableViewCell标识符

 - (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell; UILabel *label = nil; cell = [tv dequeueReusableCellWithIdentifier:@"Cell"]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"Cell"] autorelease]; label = [[UILabel alloc] initWithFrame:CGRectZero]; [label setLineBreakMode:UILineBreakModeWordWrap]; [label setMinimumFontSize:FONT_SIZE]; [label setNumberOfLines:0]; [label setFont:[UIFont systemFontOfSize:FONT_SIZE]]; [label setTag:1]; [[label layer] setBorderWidth:2.0f]; [[cell contentView] addSubview:label]; } NSString *text = [items objectAtIndex:[indexPath row]]; CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; if (!label) label = (UILabel*)[cell viewWithTag:1]; [label setText:text]; [label setFrame:CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), MAX(size.height, 44.0f))]; return cell; } 

从这个博客提取的代码。 它可以帮助你!

我认为错误在这里:

cell.tag = indexPath.row + 1000;

当你重复使用单元格时,你将不能用新的值来写它的标签。 检查细胞数目更好

[tableView indexPathForCell:cell];

请注意,它将只为可见单元格返回正确的indexPath。