7

UICollectionViewカスタムセルのサブクラス化がありますUICollectionViewCell。そして、コードで私は次のことをしました:

 [self.collectionView_ registerClass:[AHPinterestCell class]
        forCellWithReuseIdentifier:@"AHPinterestCell"];

これが私の中にあるものですcellForItem

  AHPinterestCell *cell =
                (AHPinterestCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"AHPinterestCell"
                                                                             forIndexPath:indexPath];

ただし、セルを再利用していないようです。画面ごとのコレクションビューでは、約9〜10個のセルが表示されますが、無限スクロールを実行してから呼び出すinsertItemsAtIndexPathと、カスタムセルのメソッドが呼び出されますが、initWithFrameおそらく既存のセルを再利用する必要があります。どうしてこれなの?

編集:

問題を説明するサンプルデモプロジェクトを追加しています。xcodeプロジェクトへのリンクはここにあります。一番下に到達すると、基本的に無限のスクロールを実行し、さらに多くのものを追加します。ただし、そうすると、initメソッドが再度呼び出されます。

4

3 に答える 3

4

つまり、コードは正常に機能します。予想どおり、セルが画面からスクロールアウトすると、最終的には再利用可能としてフラグが立てられます。そして、あなたが電話dequeueReusableCellWithReuseIdentifierをするとき、再利用できるセルがあれば、そうします。そうでない場合は、作成します。

多くのセルが作成されているのを確認できるのは、高速または継続的にスクロールする場合です。しかし、短い小さなスクロールを実行し、手放し、一時停止し、UIに追いついて繰り返してみると、作成されているセルはごくわずかになります。

これは、iOSが古いセルのデキューよりもUIと新しいセルの作成を優先し、それらの再利用を可能にすることを意味すると解釈します。したがって、すばやく反転すると、古いセルに追いついて、再利用可能なものとしてフラグを立てるのに問題があります。これはおそらくコレクションビューにそのようなスムーズな流れを与えるものであるため、おそらく完全に悪いことではありません。古いセルに再利用のフラグを立てることは、iOSがここで行う重要性の低いことの1つです。しかし、明らかにメモリが不足している場合、これは問題になる可能性があります。

ちなみに、を入力すると、コレクションビューを非常に高速にスクロールした後、UIが最終的に追いつくと、「ねえ、私はもっと余裕があります」というロジックが明らかに含まれていることに気付くでしょうNSLogdealloc私が本当に必要とするよりも多くの細胞、私はこれらのいくつかを取り除くつもりです。」実際、これはかなり賢い実装です。速度に重点を置いていますが、UIが停止するとメモリの最適化が行われます。

于 2013-01-22T18:13:50.330 に答える
0

同意しました。同じ問題がありますが、可能な場合は、表示されているセルを表示するカテゴリを作成することを考えました。

// Header file UITableView+VisibleCell.h"
@interface UITableView (VisibleCell)
- (UITableViewCell*) visibleCellForRowAtIndexPath:(NSIndexPath *)indexPath;
@end


// Implementation file UITableView+VisibleCell.m
#import "UITableView+VisibleCell.h"

@implementation UITableView (VisibleCell)

- (UITableViewCell*) visibleCellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    for( UITableViewCell* currentVisibleCell in self.visibleCells )
    {
        NSIndexPath* currentPath = [self indexPathForCell: currentVisibleCell ];
        if( [currentPath isEqual:(id) indexPath] )
        {
            return currentVisibleCell;
        }
    }    
    return nil;
}    
@end

表示されているセルを取得することから始めて、スタイルの問題であるnilの代わりにcellForRowAtIndexPathを返すこともできます。(これは、特定のセル内の特定のタグを持つUITextFieldを取得してFIrstResponderにするために必要でしたが、cellForRowAtIndexPathはセルを再割り当てし続け、非常にイライラしました。

于 2013-04-17T14:44:47.493 に答える
0

デバイス設定からユーザー補助をオフにします。そのバグ。iPadminiでも同じ問題が発生します。

于 2014-06-03T14:47:35.550 に答える