6

自分自身をインスタンス化し、に追加しUICollectionViewCellたい特定のものがあります。これが機能するためには、インスタンスのプロパティを設定する必要があります。UICollectionViewUICollectionViewCell.reuseIdentifier

通常、セルを説明するクラスまたはNibはコレクションビューに登録され、コレクションビューは、.reuseIdentifier次のメソッドを使用して、すでに設定されているセルをインスタンス化します。

- registerClass:forCellWithReuseIdentifier:
- registerNib:forCellWithReuseIdentifier:

ただし、このセルはコレクションビューの外部で作成しているため、これらは適用されません。

自分でセルを作成すると、セルを設定する方法がないように見えます.reuseIdentifier(これは読み取り専用プロパティであり、init...初期化するメソッドがないため)。

.reuseIdentifierが設定されていない場合UICollectionView、セルが追加されたときに例外がスローされます。UITableViewこの動作は、再利用識別子がオプションであったとは異なります。

コレクションビューセルの再利用識別子を設定する簡単な回避策は、それを.xibファイルに埋め込み、Identifierボックスを使用してから、次のようにしてセルのインスタンスを作成することです。

[NSBundle.mainBundle loadNibNamed:@"MyCellName" owner:self options:nil][0];

その後、上記のインスタンスを渡すことができ、UICollectionViewCellすべてが正常に機能します。

...しかし、それはジャンプするのにかなりばかげた恣意的なフープのようです。.xib-wrapper迂回なしでセルインスタンスにこのプロパティを設定する他の方法はありますか?


更新:Appleのドキュメントには次のように書かれています:

コードの作成プロセスを簡素化するために、コレクションビューでは、コードでビューを明示的に作成するのではなく、常にビューをデキューする必要があります。

...これは実際には当てはまりません。これは必要ないためです(つまり、外部からインスタンス化されたセルは、識別子が何らかの方法で設定されている限り、たとえばからロードされた場合など、正常に機能します.xib)。また、「私の特定のユースケースでは、「コードの作成プロセス」(追加のファイルが必要です。さらに、コレクションビューでこれらのいくつかの複雑な1回限りの作成を要求するのは面倒です)。

ただし、上記は、質問に対する答えが「いいえ」であることを意味しているようです。コレクションビューでセルをデキューする場合を除いて、使用可能なセルを作成することは意図的に「困難」です。

4

2 に答える 2

4

申し訳ありませんが、UICollectionView が UICollectionViewCells を生成するための唯一の Apple ブランドのファクトリであるという事実を受け入れる必要があると思います。したがって、まったく同じオブジェクトを表示したいコレクション ビューが 2 つある場合は、うまくいきません。

良いニュースは、2 つのコレクション ビューがあり、他のセルとまったく同じように見えるセルを表示したい場合、タスクを達成できることです。それは簡単です:

@interface MyModelClass : NSObject
  // a bunch of data
@end


@interface MyCollectionViewCell : UICollectionViewCell
-(void)refreshCellWithObject:(MyModelClass *)object;
@end

一方、どのクラスでも UICollectionView cv1 と cv2 を所有しています

[[self cv1] registerClass:[MyCollectionViewCell class] forCellWithReuseIdentifier:@"MyCollectionViewCell"];

[[self cv2] registerClass:[MyCollectionViewCell class] forCellWithReuseIdentifier:@"MyCollectionViewCell"];

データソースは同じように見える場合があります

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
   MyModelObject *obj = [self theObjectIWant];

   MyCollectionViewCell *cell;

   cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCollectionViewCell" forIndexPath:indexPath];

   [cell refreshCellWithObject:obj];

   return cell;
}
于 2013-03-22T17:14:29.040 に答える
2

この 2 つの方法を使用します。

– registerNib:forCellWithReuseIdentifier:
– dequeueReusableCellWithReuseIdentifier:forIndexPath:

AppleのUICollectionView クラス リファレンスを参照してください。

于 2012-11-08T04:21:08.217 に答える