2012-09-23 1 views
0

Le code fonctionne bien jusqu'à ce que j'ai changé UIViewController avec tableView à UICollectionViewController.UICollectionViewCell imageView

Maintenant, toutes les cellules montrent la même image, parfois il retourne à zéro. Cependant les textLabels sont OK.

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"TourGridCell"; 
    TourGridCell *cell = (TourGridCell *)[collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath]; 
    Guide *guideRecord = [self.fetchedResultsController objectAtIndexPath:indexPath]; 

    cell.titleLabel.text = [guideRecord.name uppercaseString]; 

    cell.titleLabel.backgroundColor = [UIColor clearColor]; 
    if ([guideRecord.sights count] > 0) { 

     if ([[guideRecord.sights objectAtIndex:0]valueForKey:@"thumbnail"]) { 
      cell.imageView.image = [UIImage drawImage:[[guideRecord.sights objectAtIndex:0]valueForKey:@"thumbnail"] inImage:[UIImage imageNamed:@"MultiplePhotos"] inRect:CGRectMake(11, 11, 63, 63)]; 

     }else { 
      cell.imageView.image = [UIImage imageNamed:@"placeholder2"]; 
     } 

     NSMutableString *sightsSummary = [NSMutableString stringWithCapacity:[guideRecord.sights count]]; 
     for (Sight *sight in guideRecord.sights) { 
      if ([sight.name length]) { 
       if ([sightsSummary length]) { 
        [sightsSummary appendString:@", "]; 
       } 
       [sightsSummary appendString:sight.name]; 

      } 
     } 
     if ([sightsSummary length]) { 
      [sightsSummary appendString:@"."]; 
     } 
     cell.sightsTextLabel.text = sightsSummary; 
     cell.detailTextLabel.text = [NSString stringWithFormat:NSLocalizedString(@"%i", nil) , [guideRecord.sights count]]; 
     cell.detailTextLabel.hidden = NO; 
     //  cell.textLabel.alpha = 0.7; 
     NSPredicate *enabledSightPredicate = [NSPredicate predicateWithFormat:@"notify == YES"]; 
     NSArray *sightsEnabled = [[[guideRecord.sights array] filteredArrayUsingPredicate:enabledSightPredicate]mutableCopy]; 
     NSPredicate *visitedSightPredicate = [NSPredicate predicateWithFormat:@"visited == YES"]; 
     NSArray *sightsVisited = [[[guideRecord.sights array] filteredArrayUsingPredicate:visitedSightPredicate]mutableCopy]; 

     if ([sightsEnabled count] > 0) 
     { 
      NSLog(@"green_badge"); 
      cell.notifyIV.image = [UIImage imageNamed:@"green_badge"]; 
     } 
     else if (sightsVisited.count == 0) { 
      NSLog(@"new_badge"); 
      cell.notifyIV.image = [UIImage imageNamed:@"new_badge"]; 
     } 
     else 
     { 
      cell.notifyIV.image = nil; 
     } 

    } 
    else { 
     cell.notifyIV.hidden = YES; 
     //  cell.textLabel.textColor = RGB(0, 50, 140); 
     cell.detailTextLabel.hidden = YES; 
     cell.sightsTextLabel.text = nil; 
    } 

    return cell; 
} 

cellule créée en story-board,

// TourGridCell.h 
#import <UIKit/UIKit.h> 

@interface TourGridCell : UICollectionViewCell 
@property (weak, nonatomic) IBOutlet UILabel *titleLabel; 
@property (weak, nonatomic) IBOutlet UIImageView *imageView; 
@property (weak, nonatomic) IBOutlet UIImageView *notifyIV; 
@property (weak, nonatomic) IBOutlet UILabel *textLabel; 
@property (weak, nonatomic) IBOutlet UILabel *detailTextLabel; 
@property (weak, nonatomic) IBOutlet UILabel *sightsTextLabel; 

@end 


#import "TourGridCell.h" 

@implementation TourGridCell 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 

/* 
// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 
} 
*/ 

@end 

Répondre

1

La solution est de réduire à néant l'image à chaque fois dans cellForItemAtIndexPath:

cell.imageView.image = nil; 
2

vous pourriez avoir besoin de fournir des données supplémentaires pour qu'il soit possible pour les autres de comprendre ce que le problème est. Je suppose que vous avez vérifié qu'aux différentes heures que l'on appelle les conditions sont déclenchées, donc des images différentes sont en train d'être instanciées et ajoutées à votre UICollectionViewCell? Aussi, je le prends, vous savez qu'une UICollectionViewCell n'a pas de propriété d'image, vous devrez donc ajouter une propriété dans sa sous-classe (si vous voulez un accès facile à la vue sans devoir la récupérer en utilisant son ID de tag) vue est ajouté en tant que sous-vue?

Je pense que, compte tenu des symptômes que vous avez décrits, un tel problème peut se produire si vous n'ajoutez pas vos sous-vues à contentView de UICollectionViewCell. Les vues de collection d'Apple ont toutes sortes d'optimisations pour garantir des performances élevées et seules les sous-vues de la vue de contenu de UICollectionViewCell (qui est elle-même une vue secondaire de UICollectionViewCell) seront systématiquement dessinées comme prévu. Bien que basé sur ce que vous avez fourni, je ne peux pas être définitif si c'est la cause du problème.

@implementation UICollectionViewCellSubView 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
     _imageView = [[UIImageView alloc] initWithFrame:frame]; 
     [self.contentView addSubview:_imageView]; 
    } 
    return self; 
} 


- (void)prepareForReuse 
{ 
    [super prepareForReuse]; 
    // ensure you do appropriate things 
    // here for when the cells are recycled 
    // ... 

} 

@end 
+0

J'ai fourni le code pour la cellule, mais toutes les sous-vues de la cellule que j'ai ajoutées dans le storyboard dans la cellule prototype ... – Shmidt

1

si vous faites du dessin personnalisé dans votre cellule, vous devez informer la cellule de se « redessiner » lorsqu'une cellule a été 'réutilisé'. Cela est peut-être plus facile en implémentant la méthode prepareForReuse dans votre sous-classe UICollectionViewCell.

- (void)prepareForReuse { 
    [super prepareForReuse]; 
    [self setNeedsDisplay]; 
} 

Techniquement, on n'a pas besoin probablement d'inclure [super prepareForReuse] que la documentation indique « L'implémentation par défaut de cette méthode ne fait rien ». Cependant, c'est une bonne pratique, et qui sait si Apple va changer l'implémentation par défaut de prepareForReuse à l'avenir.

Questions connexes