Reputation: 19946
I want to use UITableviewCell
reuse,I have a custom UITableViewCell
and using ARC,my UITableViewCell
is different . my code is:
- (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;
}
you know if I use
cell = [[TimeLineViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]
instead
cell = [[TimeLineViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellIdentifier11"];
My cell always at mistake location. Why am I not able to use the same reuseIdentifier
. If I use a different reuseIdentifier,if my cell is not reuse.
For other Viewcontroller views, when height of the cell is the same and I use the same reuseIdentifier
everything is ok. Can anybody help me with the problem?
Edit: My Custom cell code:
#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
Upvotes: 2
Views: 21758
Reputation: 1767
Either don't reuse the cells, or give each one a custom identifier.
For custom identifiers, replace this:
static NSString *CellIdentifier = @"TimeLineViewCell";
TimeLineViewCell *cell = (TimeLineViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell==nil){
cell = [[TimeLineViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellIdentifier11"];
}
with this:
TimeLineViewCell *cell = (TimeLineViewCell*)[tableView dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"%i", indexPath.row]];
if(cell==nil){
cell = [[TimeLineViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[NSString stringWithFormat:@"%i", indexPath.row]];
}
Otherwise, just don't dequeue, and create a new cell every time.
Note: custom identifiers based on the cell's indexPath.row will only work if there is no table editing going on by the user. If they WILL edit the table, don't reuse the cells.
Upvotes: 2
Reputation: 11
The blog provided by @Praveen has the right answer. You have to implement the following method as @Sean D. mentioned:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
This is the right way to set the height of TableViewCells. You have to determine the height of the row based on the content of the cell. As you know indexPath, you can determine the height for each row through indexPath.row
Upvotes: 1
Reputation: 3254
I think the error is here:
cell.tag=indexPath.row+1000;
When you reusing the cell you will owerwrite it's tag with the new value. It is better to check the cell number with
[tableView indexPathForCell:cell];
Please note it will return the correct indexPath for the visible cell only.
Upvotes: 0
Reputation: 1155
Implement - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
as @Sean mentioned.
Should look like this:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [self calculateRowHeighForIndexPath:indexPath];
}
- (CGFloat)calculateRowHeighForIndexPath:(NSIndexPath *)indexPath
{
//return height of corresponding image here
}
Upvotes: 1
Reputation: 24476
I'm following below way to reuse the UITableViewCell
identifier
- (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;
}
Code extracted from this blog. It may helps you!
Upvotes: 0