2013-03-13 85 views
2

我想用UITableviewCell重用,我有一個自定義的UITableViewCell和使用ARC,我的UITableViewCell是不同的。我的代碼是:如何使用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。如果我使用不同的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 
+1

如果您使用不同的reuseidentifier,您的單元格不會被重用它總是創建一個新的單元格。 如果您使用相同的標識符,會發生什麼情況是單元格將被重用,在這種情況下,舊內容可能會導致問題。所以你需要在添加新值之前刪除舊內容 – 2013-03-13 08:00:26

+0

我添加我的代碼如何刪除舊內容 – pengwang 2013-03-13 09:40:06

+2

這個問題是不連貫的。它有一個賞金的事實並不神奇地使它連貫。 – matt 2013-03-18 04:06:40

回答

0

我按照下面的方式來重用UITableViewCell標識,從this博客中提取

- (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; 
} 

代碼。它可以幫助你!

+0

謝謝你,你的方法我知道,但是當我在單元格中有不同的視圖時,並且所有視圖高度都不固定,例如image1在cell1中是80,但在cell2可能是90,在cell3可能是隱藏的。的帖子。 – pengwang 2013-03-13 07:27:55

+0

@pengwang 80在這個意義上?你的意思是細胞的高度。你是否期待動態高度爲你的'UITableView' – Praveenkumar 2013-03-13 07:35:12

+0

它是圖像視圖的高度。基於單元格內容的單元格高度變化 – pengwang 2013-03-13 09:26:02

1

作爲@Sean提到的- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath。 應該是這樣的:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return [self calculateRowHeighForIndexPath:indexPath]; 
} 

- (CGFloat)calculateRowHeighForIndexPath:(NSIndexPath *)indexPath 
{ 
    //return height of corresponding image here 
} 
0

我認爲錯誤是在這裏:

cell.tag = indexPath.row + 1000;

當您重新使用單元格時,您將無法使用新值寫入標籤。 最好用

[tableView indexPathForCell:cell];

請注意,它只會返回可見單元格的正確indexPath。

1

@Praveen提供的博客有正確答案。你必須實現以下方法@Sean D.提到:

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

這是設置TableViewCells的高度,以正確的方式。您必須根據單元格的內容來確定行的高度。正如您所知的indexPath,您可以通過indexPath.row確定每行的高度

2

要麼不重複使用這些單元格,要麼給每個單元格一個自定義標識符。

對於自定義標識,更換此:

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]]; 
} 

否則,就是不離隊,並創建一個新的細胞每次。

注意:基於單元格的indexPath.row的自定義標識符僅在用戶未進行表格編輯時纔有效。如果他們將編輯表格,請勿重複使用單元格。

+0

好的答案! @AMayes – GangstaGraham 2013-06-03 02:35:25