web-dev-qa-db-ja.com

Interface Builderを使用してnibでUICollectionViewセルをデザインする(ストーリーボードなし)

カスタムUICollectionViewCellプロトタイプ(Xcode 5.0.2)を設計しようとしていますが、インターフェイスビルダーでは、ペン先の設計中にセルをUICollectionViewに追加できません。ストーリーボードを使用している場合は、アイテム(セル)の数を設定でき、Interface Builderはセルを完全に作成して表示しますが、ペン先のコレクションビューにセルを追加できません。私はもう試した:

  • オブジェクトライブラリからコレクションビューのセルをコレクションビューに手動でドラッグアンドドロップします。 (失敗:ビューのどこにもセルをドロップできません)
  • ストーリーボードのセルを使用してコレクションビューを作成し、ビュー全体をnibにコピーして貼り付けます。 (失敗:コレクションビューはコピーされますが、セルは失われます)
  • ストーリーボードのセルを含むコレクションビューを作成し、ストーリーボードをソースコードとして開き、コレクションビューのセルを見つけ、関連するXMLをコピーし、nibをソースコードとして開き、コレクションビュー内にXMLで貼り付けます。 (失敗:インターフェイスビルダーでnibを開くことができない場合、エラーが発生します。セルをソースコードから削除すると、再び開きます。実行しないしない試してくださいこれは、自分が何をしているかわからない場合に使用します。)

同じ問題についての質問もいくつか見ました。

それらはすべて、それらをプログラムで行うこと、および/またはセルに別のペン先を使用することを指摘しています。私はそれらを行う方法を知っていますが、コレクションビュー内のコレクションビューセルをnibの同じビュー内に設計する方法はありますか?ストーリーボードのように?なぜInterface Builderでは、ストーリーボードを完全に使用できる(そして奨励する)nibでそれができないのですか?

27
Can Poyrazoğlu

簡単な答えは「いいえ」です。これは実行できません。ストーリーボードをXIBのコレクションと考えてください。 XIBは、特定のビューのファセットを定義するだけなので、実行時に構築できます。

コレクションビューとそのストーリーボードの実装に関しては、ストーリーボードではビューコントローラーのネストとXIBを使用したコレクションビューの定義が可能であることを理解することが重要です。ストーリーボードはアプリケーションの「ストーリー」またはシーンを定義する手段であるため、コレクションビュー内で使用する再利用可能なビューを宣言できるのはごく自然なことです。

XIBの背後にある基本的な考え方は再利用性にあるため、XIBについても同じことは言えません。これにより、コントローラーがこれらのクラスをコレクションビューに登録している限り、XIBで定義されたコレクションビューでセルを使用できます。このようにすると、別のコントローラーが同じXIBを使用して異なるセルなどを登録できるため、再利用性の利点が得られます。

したがって、XIBが目指す単一責任の原則(それと呼ぶことができる場合)に違反するため、XIB内のコレクションビューのサポートされるセルの宣言を許可することは、はるかに混乱します。

最善の解決策は、インスタンス化時に関連するセルを登録するカスタムコレクションビューサブクラスを定義し、このクラスをXIBで使用することです。

26
Daniel Galasko