質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.33%

  • Swift

    7698questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    4355questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

UICollectionViewでindexPathごとに読み込むカスタムセル(xib)を切り分けたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 967
退会済みユーザー

退会済みユーザー

コレクションビューでindexPathごとに使用するカスタムセルを切り分けたいと考えております。
現在は、全てのindexPathで同じカスタムセル名でnibを作成し、reusecellとして登録しています。
作ろうとしているものがセルごとに画像やボタンの配置が違ったりするので、画面ごとにxibを作成して、使い分けたいです。
nibを複数登録し、セルのデータを返すメソッドでindexPathが0のときは・・・と分岐してみましたが、上手くいきませんでした。

そもそも目的を達成するためには、この方法ではないほうが良いのでしょうか?

let screenNames = ["screenName01","screenName02","screenName03".....]

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.automaticallyAdjustsScrollViewInsets = false
        // セルのNibを登録
        self.collectionView!.register(UINib(nibName: "CollectionViewCell1", bundle: nil), forCellWithReuseIdentifier: "cell1")
        self.collectionView!.register(UINib(nibName: "CollectionViewCell2", bundle: nil), forCellWithReuseIdentifier: "cell2")
    }

(中略)

    //データを返す
    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
    {
        let cell1: CollectionViewCell1 = collectionView.dequeueReusableCell(withReuseIdentifier: "cell1", for: indexPath as IndexPath) as! CollectionViewCell1
        let cell2: CollectionViewCell2 = collectionView.dequeueReusableCell(withReuseIdentifier: "cell2", for: indexPath as IndexPath) as! CollectionViewCell2

        if(indexPath.row == 0)
            cell1.mainImage.image = UIImage(named: screenNames[indexPath.row])
            return cell1
        } else {
            cell2.mainImage.image = UIImage(named: screenNames[indexPath.row])
            return cell2
        }
    }
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

パっと見で。

  • 1も2もdequeueReusableCell()のidがcellになっている。 → cell1cell2
  • 1と2の2つのセルを生成した後で振り分けるのではなく、振り分けた後で1か2のセルを生成するようにする。

ところで、Storyboardは使ってないんですか?
Storyboardならregister()とかしなくて済みますが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/08 21:50 編集

    最初はstoryboardでコレクションビューのカスタムセルに、カスタムセルクラスを設定していましたが
    上手くxibのセルを読み込んでくれずもとのセルの方を読み込んでいました。
    register()の方法があると知り、試してみたら上手くxibで作ったセルを表示できたのでこの方法で実装しました。

    storyboardでカスタムクラスにカスタムセルクラス、identifierにcellを設定していますが、xibの方の設定がおかしいのか表示されません。
    xibのcollection view cellではカスタムクラスにカスタムセルクラスを設定し、identifierに同じくcellを設定していますがエラーがでて落ちます。

    エラー内容
    ...
    ...
    could not dequeue a view of kind: UICollectionElementKindCell with identifier cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard
    ...

    キャンセル

  • 2017/02/08 22:05

    もう一度設定しなおしたら、カスタムセルクラスのUIImageViewを表示する部分でエラーに変わりました。

    fatal error: unexpectedly found nil while unwrapping an Optional value

    xibのUIImageViewと接続していますが、xibではなく元のセルを見に行っているようです。
    元のセルにUIImageViewを設定したら、表示されました。
    xibの方は接続できていますが、表示できません。
    どのようにして、xibの方のセルを使えるようになるんでしょうか。

    キャンセル

  • 2017/02/09 07:11

    元のセルって何なんでしょうか?

    キャンセル

  • 2017/02/09 08:52

    xibではなく、最初にstoryboardにUICollectionViewを配置したときのセルです。

    キャンセル

  • 2017/02/09 09:22 編集

    Storyboardのセルを使わずにxibのセルを使っているんですよね?
    でしたら「Storyboardでカスタムクラスにカスタムセルクラス、identifierにcellを設定」する必要はありませんし、そもそも使っていないのですからStoryboardのセルは削除しておけばいいです。

    キャンセル

  • 2017/02/09 09:43

    storyboardのセルを削除して、xibのセルのカスタムクラスにカスタムセルクラス、identifierにcellを設定してみましたが、Thread1: single SIGABRTでエラーになっています。

    エラー内容
    Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'could not dequeue a view of kind: UICollectionElementKindCell with identifier cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard

    register()を使わずにxibを使おうとすると、ずっとこのようなエラーになっていますが、設定が足りていないのでしょうか?

    キャンセル

  • 2017/02/09 10:00

    register()使ってないんですか?

    キャンセル

  • 2017/02/09 10:08

    はい。
    xibでカスタムセルクラスとかを設定していたら、必要ないと思っていましたが
    registerが必要ないのはstoryboardのときだけですか?

    キャンセル

  • 2017/02/09 10:30

    >>必要ないと思っていましたが
    いつからそう思っていたのでしょうか?

    キャンセル

  • 2017/02/09 10:37

    すみません。
    回答頂いたときにstoryboardならregister()とかしなくて・・・
    という部分でxibとstoryboardを混同して勘違いしていました。

    キャンセル

同じタグがついた質問を見る

  • Swift

    7698questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    4355questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。