2016-12-16 4 views
0

Ich zeige Bilder in scrollview horizontal in UItableviewCell.UItableviewCell Zelle Wiederverwendung Problem

Problem ist, wenn ich scrollen tableview Bilder bekam mismatched.Below Referenz mein Code:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

ManufacturersTableviewCustomCell * cell = (ManufacturersTableviewCustomCell *)[tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; 
if (cell == nil) 
{ 
    cell = [[ManufacturersTableviewCustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 
} 


cell.scrollview.delegate = self; 
cell.backgroundColor = [UIColor clearColor]; 
cell.backgroundView = [UIView new] ; 
cell.selectedBackgroundView = [UIView new] ; 
cell.scrollview.tag = indexPath.row; 
cell.btnViewAll.tag = indexPath.row; 

NSDictionary *dict ; 
NSArray *aryImages; 


if(isFiltered && [aryFilteredProducts count]>0){ 
    dict = [[aryFilteredProducts objectAtIndex:indexPath.row]valueForKey:@"manufacturers"]; 
    aryImages = [[aryFilteredProducts objectAtIndex:indexPath.row]valueForKey:@"sub_categories"]; 
} 
else if([aryProducts count]>0){ 
    dict = [[aryProducts objectAtIndex:indexPath.row]valueForKey:@"manufacturers"]; 
    aryImages = [[aryProducts objectAtIndex:indexPath.row]valueForKey:@"sub_categories"]; 

} 

NSString *strUppercase = [[dict valueForKey:@"manufacturers_name"] uppercaseString]; 
cell.lblManufacturerName.text = strUppercase; 

NSString *strImgUrl = [NSString stringWithFormat:@"%@/%@",KServerUrl,[dict valueForKey:@"original_image"]]; 

if(![[NSURL URLWithString: strImgUrl] isKindOfClass:[NSNull class]]) 
    [cell.imgViewManufacturer setImageWithURL:[NSURL URLWithString:strImgUrl] placeholderImage:[UIImage imageNamed:@"Background.png"] usingActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 

[cell.viewBorder.layer setBorderColor: [[UIColor colorWithRed:234.0/255.0 green:234.0/255.0 blue:234.0/255.0 alpha:1.0] CGColor]]; 
[cell.viewBorder.layer setBorderWidth: 1.0]; 

[cell.imgViewManufacturer.layer setBorderColor: [[UIColor colorWithRed:234.0/255.0 green:234.0/255.0 blue:234.0/255.0 alpha:1.0] CGColor]]; 
[cell.imgViewManufacturer.layer setBorderWidth: 1.0]; 

CGFloat contentWidth = 0; 

for(int i=0;i< [aryImages count];i++) 
{ 
    if(SCREEN_MAX_LENGTH == 568){ 
     if([aryImages count] >3){ 
      cell.btnViewAll.hidden = NO; 
     } 
     else { 
      cell.btnViewAll.hidden = YES; 
     } 
    } 
    else{ 
     if([aryImages count] >5){ 
      cell.btnViewAll.hidden = NO; 
     } 
     else { 
      cell.btnViewAll.hidden = YES; 
     } 
    } 
    NSDictionary *dictImageData = [aryImages objectAtIndex:i]; 

    UIImageView *imgView = [[UIImageView alloc]initWithFrame:CGRectMake([aryImages indexOfObject:dictImageData]*(80 + 5),0,80,80)]; 

    if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad){ 
     [imgView setFrame:CGRectMake([aryImages indexOfObject:dictImageData]*(130 + 5),0,130,130)]; 
    } 
    [imgView.layer setBorderColor: [[UIColor colorWithRed:234.0/255.0 green:234.0/255.0 blue:234.0/255.0 alpha:1.0] CGColor]]; 
    [imgView.layer setBorderWidth: 1.0]; 
    imgView.tag = i; 
    // add tapgesture 

    UITapGestureRecognizer *tapgestureImg = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(imageTapped:)]; 
    [imgView addGestureRecognizer:tapgestureImg]; 

    NSString *strImgUrlSubCat = [NSString stringWithFormat:@"%@/%@",KServerUrl,[dictImageData valueForKey:@"sub_product_img"]]; 

    imgView.userInteractionEnabled = NO; 

    imgView.image = [UIImage imageNamed:@"Background.png"]; 

    if(![[NSURL URLWithString: strImgUrlSubCat] isKindOfClass:[NSNull class]]){ 
     [imgView setImageWithURL:[NSURL URLWithString:strImgUrlSubCat ] placeholderImage:[UIImage imageNamed:@"Background.png"] usingActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
     imgView.userInteractionEnabled = YES; 

    } 
    [cell.scrollview addSubview:imgView]; 

    UIView *vwBackGround = [[UIView alloc]initWithFrame:CGRectMake([aryImages indexOfObject:dictImageData]*(80 + 5), 60, 80, 20)]; 
    if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad){ 
     [vwBackGround setFrame:CGRectMake([aryImages indexOfObject:dictImageData]*(130 + 5), 90, 130, 40)]; 
    } 
    vwBackGround.backgroundColor = [UIColor blackColor]; 
    vwBackGround.alpha = 0.5; 
    [cell.scrollview addSubview:vwBackGround]; 

    UILabel *lblProductName = [[UILabel alloc]initWithFrame:CGRectMake([aryImages indexOfObject:dictImageData]*(80 + 5)+4, 60, 70, 20)]; 
    lblProductName.font = [UIFont fontWithName:@"Helvetica" size:10.0]; 

    if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad){ 
     [lblProductName setFrame:CGRectMake([aryImages indexOfObject:dictImageData]*(130 + 5)+4, 90, 120, 40)]; 
     lblProductName.font = [UIFont fontWithName:@"Helvetica" size:17.0]; 

    } 
    lblProductName.textColor = [UIColor whiteColor]; 
    lblProductName.text = [dictImageData valueForKey:@"sub_product_name"]; 
    [cell.scrollview addSubview:lblProductName]; 

    [cell.scrollview bringSubviewToFront:vwBackGround]; 
    [cell.scrollview bringSubviewToFront:lblProductName]; 

    if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad){ 
     contentWidth += 130 + ([aryImages indexOfObject:dictImageData]==0?0:5); 
    } 
    else{ 
     contentWidth += 80 + ([aryImages indexOfObject:dictImageData]==0?0:5); 

    } 
} 


cell.scrollview.contentSize = CGSizeMake(contentWidth, cell.scrollview.frame.size.height); 

return cell; 
} 

Können Sie bitte vorschlagen, wie dieses Problem zu beheben.

+0

Zellen, wie Sie sagen, wiederverwendet werden. Daher müssen Sie jeden Fall abdecken. Dein Code nicht. Fragen Sie sich, was passiert, wenn die Bildansicht bereits zu dieser Zelle hinzugefügt wurde und jetzt die Zelle wiederverwendet wird und der Code ausgeführt wird. – matt

+0

Wenn Sie "UIImages" dynamisch hinzufügen und sie nicht erneut verwenden, löschen Sie den wiederverwendeten Zelleninhalt, bevor Sie neue Bilder hinzufügen. Das Schlüsselwort zum Verstehen von 'UITableviewCell' ist' reused' – Nazir

+0

Ich habe diesen Code if ([cell.contentView subviews]) { für (UIView * subview in [cell.contentView subviews]) { if ([subview isKindOfClass: [UIImageView Klasse]]) { [Unteransicht removeFromSuperview]; } } } aber nicht funktioniert.Ist es etwas zu tun – user2931321

Antwort

0

entfernen imageviews vor dem Hinzufügen ..

löste es von unten Code in cellForRowAtIndexPath Zugabe

if ([cell.scrollview subviews]){ 
    for (UIView *subview in [cell.scrollview subviews]) { 
     if([subview isKindOfClass:[UIImageView class]] || [subview isKindOfClass:[UIView class]]){ 
     [subview removeFromSuperview]; 
     } 
    } 
} 
Verwandte Themen