0

UIViewControllerに変更するまで、コードは正常に機能tableViewUICollectionViewControllerます。

これで、すべてのセルに同じ画像が表示され、場合によってはnilに反転します。ただし、textLabelsは問題ありません。

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

ストーリーボードに設定されたセル、

//  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
4

3 に答える 3

2

他の人が問題が何であるかを理解できるようにするために、さらにいくつかのデータを提供する必要があるかもしれません。これは、条件がトリガーされていると呼ばれるさまざまな時点で、さまざまな画像が実際にインスタンス化されてUICollectionViewCellに追加されていることを確認したと思いますか?また、UICollectionViewCellにはimageプロパティがないことを知っていると思います。そのため、そのサブクラスにプロパティを追加する必要があります(タグIDを使用してビューを取得するオーバーヘッドなしに、ビューに簡単にアクセスしたい場合)。ビューはサブビューとして追加されますか?

あなたが説明した症状を考えると、UICollectionViewCellのcontentViewにサブビューを追加していない場合、このような問題が発生する可能性があると思います。Appleのコレクションビューには、高性能を確保するためのあらゆる種類の最適化があり、UICollectionViewCellのコンテンツビュー(それ自体がUICollectionViewCellのサブビュー)のサブビューのみが、期待どおりに一貫して描画されます。

あなたが提供したものに基づいていますが、これが問題の原因であるかどうかを明確にすることはできません。

@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
于 2012-09-24T08:51:55.213 に答える
1

解決策は、で毎回画像を無効にすることですcellForItemAtIndexPath:

cell.imageView.image = nil;
于 2012-09-24T12:36:37.257 に答える
1

セルでカスタム描画を行う場合は、セルが「再利用」されたときに「再描画」するようにセルに通知する必要があります。これはprepareForReuse、UICollectionViewCellサブクラスにメソッドを実装することでおそらく最も簡単に実行できます。

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

技術的には、ドキュメントが示唆しているように、おそらく含める必要はあり[super prepareForReuse]ません。「このメソッドのデフォルトの実装は何もしません」。prepareForReuseただし、これは良い習慣であり、Appleが将来のデフォルトの実装を変更するかどうかは誰にもわかりません。

于 2013-05-03T04:06:56.840 に答える