22

UICollectionView を IB の .nib ファイルに追加しようとしています。いくつかのチュートリアルを実行しましたが、問題はありませんでした。

私の既存のアプリでは、コレクション ビューを IB のビューにドラッグしてからオブジェクトを展開すると、CollectionView フロー レイアウトは存在しますが、コレクション ビュー セルはありません。コレクション ビューにセルをドラッグ アンド ドロップすることもできません。また、コレクション ビューの表示も異なり、通常の白いボックスではなく、セルのグリッドのイメージが表示されます。

nibを使用して新しいView Controllerを作成しようとしましたが、collectionViewを追加しても同じ結果になりました。

このアプリは iOS 4.2 をターゲットにしていましたが、デプロイ ターゲットを iOS 6 に変更しました。

新しく作成されたプロジェクトでは、この動作は得られません。

4

4 に答える 4

9

なぜ機能しないのかはわかりませんが、私にとっては、このブログ投稿のサブクラス アプローチが問題を解決しました。

http://www.adoptioncurve.net/archives/2012/09/a-simple-uicollectionview-tutorial.php

ここに短い要約があります:

  • UICollectionViewCell を拡張する新しいクラス MyViewCell を作成し、必要に応じてプロパティ、アクション、アウトレット、およびメソッドを作成します。

@interface MyViewCell : UICollectionViewCell

  • コレクション ビュー セルをルート オブジェクトとしてビュー (xib ファイル) を作成します (デフォルトで作成されたオブジェクトを削除します)。
  • 属性で、このコレクション ビュー セルのカスタム クラスを拡張クラス MyViewCell (デフォルトの UICollectionViewCell ではなく) に設定します。
  • Collection Reusable View の下の属性で、識別子 (myCell など) を定義します。これは後で呼び出しを登録するために必要になります。
  • カスタム クラスに戻り、 inithWithFrame メソッドを変更して、作成したビューを読み込んで使用します。

    - (id)initWithFrame:(CGRect)frame 
    { 
       self = [super initWithFrame:frame]; 
       if (self) 
       { 
         // Initialization code 
         NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"CVCell" owner:self options:nil];
    
         if ([arrayOfViews count] < 1) { return nil; }
    
         if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]]) { return nil; }
    
         self = [arrayOfViews objectAtIndex:0];
       }
       return self;
    }
    
  • 次に、このクラスを collectionView で使用するように登録できます

[self.collectionView registerClass:[MyViewCell class] forCellWithReuseIdentifier:@"myCell"];

于 2012-12-19T17:47:02.187 に答える
9

質問されてからしばらく経ちましたが、最近同じ問題に直面しました。

最終的に、私はここで答えを見つけました。

要するに:

  • .xib ファイルにいる場合、UICollectionViewCell を UICollectionView にドラッグ アンド ドロップすることはできません。これはストーリーボードでのみ可能です。

  • 回避策は、カスタム セル用の .xib ファイルを作成し、次を使用してセルを手動で登録することです。

    [self.collectionView registerClass:[CollectionViewCell class] forCellWithReuseIdentifier:CELL_ID];

于 2015-10-16T13:14:47.683 に答える
3

セル ビューを別の nib ファイルで定義します。ビューはタイプUICollectionViewCellまたはサブクラスでなければなりません。

次に、nib をコレクション ビューに登録する必要があります。

- (void)viewDidLoad
{
    UINib *cellNib = [UINib nibWithNibName:@"MyNib" bundle:nil];
    [self.collectionView registerNib:cellNib forCellWithReuseIdentifier:@"cell"];
}
于 2012-11-17T11:03:36.737 に答える
0

これらの回答は正しいものですが、問題の根本的な原因は非常に微妙であり、Apple はログ内のエラー メッセージを更新する必要があります。あなたが見るとき:

Unknown class MyViewCell in Interface Builder file.

実際には、ソース コードに@implementation宣言がないか、.m ファイルがターゲットに追加されていないことを意味します。したがって、コードをチェックして、次のものがあることを確認してください。

@implementation MyViewCell

@end

これは、UITableViewCell と UICollectionViewCell の両方に当てはまります。

一般的なケースについては、 https://stackoverflow.com/a/12755891/539149でさらに問題について説明します。

興味深いことに、 @implementationと呼び出しが欠落している場合:

[self.myCollectionView registerClass:[MyViewCell class] forCellWithReuseIdentifier:@"MyViewCell"];

以下が表示されます。

Undefined symbols for architecture armv7:
  "_OBJC_CLASS_$_MyViewCell", referenced from:
      objc-class-ref in MyViewController.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

したがって、Apple は問題を認識しており、コンパイル中に問題を検出していないだけです。カスタム セルを別のペン先に配置したり、registerClass: forCellWithReuseIdentifier: を呼び出したりしないことをお勧めします。Interface Builder のコンテナ UICollectionView または UITableView 内にカスタム セルを格納する方がはるかにクリーンです。

于 2014-04-01T21:33:55.670 に答える