2012-10-08 8 views
16

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

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

nibで新しいView Controllerを作成しようとしましたが、collectionViewを追加するときに同じ結果が得られました。

このアプリは、iOS 4.2をターゲットとしましたが、私はこの動作を得ることはありません任意の新しく作成されたプロジェクトでのiOS 6

にデプロイメント・ターゲットを変更しました。

+6

OK、あなたが唯一の完全にIBを使用してUICollectionViewをレイアウトすることができているようですストーリーボードの中で。 .nibでは、私は上記の動作を取得します。ストーリーボードでは、UICollectionViewを使用してUICollectionViewCellを取得します。どうしたの??? – Alpinista

+0

同様の問題もありますが、むしろ厄介です – adit

+0

ストーリーボードでも、コレクションビューセルをドラッグしてコレクションビューオブジェクトにドロップすることはできません。理由は分かりません。 – theiOSguy

答えて

3

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

その後、あなたはあなたのコレクションビューでペン先を登録する必要があります。

- (void)viewDidLoad 
{ 
    UINib *cellNib = [UINib nibWithNibName:@"MyNib" bundle:nil]; 
    [self.collectionView registerNib:cellNib forCellWithReuseIdentifier:@"cell"]; 
} 
+2

これは何らかの理由で動作しません。セルをデキューすると、例外がスローされます。「nibには、UICollectionReusableViewインスタンスでなければならない最上位レベルのオブジェクトが1つ含まれている必要があります。ドキュメントには「nibファイルにはトップレベルのオブジェクトが1つしかなく、そのオブジェクトのタイプがUICollectionViewCellでなければなりません」という記述があるため、これは本当に奇妙です。 – DELUXEnized

+0

UICollectionViewCellはUICollectionReusableViewから継承します。 –

8

それは動作しませんなぜ私はあなたを伝えることはできませんが、私にとっては、このブログの記事からサブクラスのアプローチは、問題を解決:

ここ

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

短い要約です:

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

@interface MyViewCell : UICollectionViewCell

  • そのルートオブジェクトとしてコレクションビューのセルに表示(XIBファイル)を作成(およびデフォルトで作成されたオブジェクトを削除します)。
  • は、このコレクションビューセルのカスタムクラスを拡張クラスMyViewCell(デフォルトのUICollectionViewCellではなく)に設定します。コレクション再利用可能ビューの属性の
  • は、識別子を定義します。 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; 
    } 
    
  • あなたはこれらの答えが正しいですが、問題の根本的な原因は、非常に微妙とAppleである

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

+0

これは理論的に質問に答えるかもしれませんが、回答の重要な部分をここに含め、参考にするためのリンクを提供することが望ましいでしょう(http://meta.stackexchange.com/q/8259)。 –

+0

私は答えに詳細を追加しました。 – DELUXEnized

+0

恐ろしい!コレクションビューを登録するのを忘れないでください: [self.collectionView registerClass:[MyViewCell class] forCellWithReuseIdentifier:@ "myCell"]; – atulkhatri

0

とcollectionViewで使用されるように、このクラスを登録することができますログのエラーメッセージを更新する必要があります。あなたが表示されたら:

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:を呼び出すことをお勧めします。インターフェイスビルダのコンテナUICollectionViewまたはUITableViewの内部にカスタムセルを格納する方がはるかにクリーンです。

8

質問がありましたので、しばらくしていますが、最近同じ問題に直面しました。

最終的に、回答はhereです。要するに

  • あなたは.xibファイル内にある場合は、UICollectionViewにUICollectionViewCellをドラッグ&ドロップすることはできません。これはストーリーボードでのみ可能です。
  • 回避策は、カスタムセルの.xibファイルを作成し、使用して手動でセルを登録することです:

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

+0

これはXcode 8.2.1で引き続き問題になります。私は回避策を永遠に使用しなければならないと思います。 –

+0

回避策として、registerNibを使用する必要があります。そうしないと、dequeueReusableCellは空のビューになります。xibで設定された情報はありません。 –

+0

まだXcodeと同じ8.3。なぜ... – Jonny

関連する問題