3

ここで皆さんに挑戦です...

ウィッチが正しくロードされているUICollectionView内部があります。UIViewControllerまた、カスタムUICollectionViewCellクラス ウィッチに が含まれていUIButtonます。

カスタム のボタンに 1 つの背景画像を割り当てるためにNSArray、いくつかのオブジェクトを使用してサーバーからを取得します。UIImageUICollectionViewCell

私のcellForItemAtIndexPath関数のコードは次のとおりです。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;
{
    UserPhotoCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"userPhotoCell" forIndexPath:indexPath];

    if (indexPath.section == 0) {
        [[cell imageButton] setBackgroundImage:[userPublicImages objectAtIndex:indexPath.row] forState:UIControlStateNormal];
    } else {
        [[cell imageButton] setBackgroundImage:[userPrivateImages objectAtIndex:indexPath.row] forState:UIControlStateNormal];
    }

    return cell;
}

ご覧のとおり、非常に単純です。

ここで奇妙な動作が発生します。すべてのカスタムUICollectionViewCellを の 1 つのセクションだけに配置するUICollectionViewと、パフォーマンスは問題ありません...

何か案は?

いくつかの追加情報:UICollectionViewヘッダーがあります。カスタム ヘッダー。現時点ではちょっとしたUIView知恵です。UILabel

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
    UICollectionReusableView *reusableView = nil;

    if (kind == UICollectionElementKindSectionHeader) {
        UICollectionReusableView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"collectionHeader" forIndexPath:indexPath];
        UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, [headerView frame].size.width, 40.0f)];
        if (indexPath.section == 0) {
            [titleLabel setText:NSLocalizedStringFromTable (@"collectionTitle_publicPhotos", [[NSLocale preferredLanguages] objectAtIndex:0] , @"")];
        } else {
            [titleLabel setText:NSLocalizedStringFromTable (@"collectionTitle_privatePhotos", [[NSLocale preferredLanguages] objectAtIndex:0] , @"")];
        }
        [headerView addSubview:titleLabel];

        reusableView = headerView;
    }

    return reusableView;
}
4

1 に答える 1

14

私は答えを見つけたと思います。何らかの奇妙な理由で、[collectionView reloadData]メインスレッドで起動されていませんでした。だから、私の解決策はそれと同じくらい簡単です:

dispatch_async(dispatch_get_main_queue(), ^{
        [_collectionUserPhotos reloadData];
    });

これで、UICollectionView が必要に応じてすぐに更新されます。

いくつかのメモ: これは、キューを使用した後、 AFNetworking[collectionView reloadData]を使用してカスタム クラスからデリゲート メソッドで呼び出されました。それが役に立てば幸い。

于 2013-05-08T07:54:28.263 に答える