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

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

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

1回答

4345閲覧

xibで作成したUIView上にCollectionViewを実装したい

Y_M

総合スコア265

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2017/03/01 08:11

###前提・実現したいこと
あるUIViewControllerを継承した画面があります 「A画面」
ある画面にxibを使ってUIViewを追加します 「B画面」
その「A画面」上にCollectionViewを追加し、CustomCell用のxibを作成します 「C画面」

この状態で「B画面」「C画面」それぞれにカスタムクラスを追加して、
「B画面」上にCollectionViewを追加しましたがうまく表示されません。

何が原因なのでしょうか。

###該当のソースコード

Swift

1//「A画面」で「B画面」のxibを追加、表示する処理 2functionView = UINib(nibName: "PointCard", bundle: Bundle.main).instantiate(withOwner: self, options: nil)[0] as! UIView 3functionView.frame = self.view.frame 4let delegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate 5delegate.window?.addSubview(functionView)

Swift

1import UIKit 2 3class PointCard: UIView, UICollectionViewDelegate, UICollectionViewDataSource { 4 5 @IBOutlet weak var collectionView: UICollectionView! 6 7 override init(frame: CGRect) { 8 super.init(frame: frame) 9 } 10 11 required init?(coder aDecoder: NSCoder) { 12 super.init(coder: aDecoder) 13 14 let nib = UINib(nibName: "PointCardCell", bundle: nil) 15 collectionView.register(nib, forCellWithReuseIdentifier: "Cell") 16 //↑ここで 「unexpectedly found nil while unwrapping an Optional value」 17 } 18 19 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 20 return 10 21 } 22 23 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 24 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! PointCardCell 25 return cell 26 } 27 28}

###試したこと

###補足情報(言語/FW/ツール等のバージョンなど)
Xcode8.2.1
Swift3

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Nibから初期化した際、required init?(coder aDecoder: NSCoder)の時点ではcollectionViewのインスタンスがまだ出来ていないのが原因だと思われます。

swift

1@IBOutlet weak var collectionView: UICollectionView! { 2 didSet { 3 let nib = UINib(nibName: "PointCardCell", bundle: nil) 4 collectionView.register(nib, forCellWithReuseIdentifier: "Cell") 5 } 6}

このように書いて、確実にcollectionViewのインスタンスができたことを確認できたタイミングで登録するようにするといいと思います。もちろんライフサイクルをきちんとしらべてlayoutSubviewsなどSubViewが置かれた後のタイミングで呼び出すのもありですが、didSetを使えばそこを深く考える必要がなく、コードの分割という意味でも同じインスタンスに関しての処理がまとまってメンテナンスしやすくなるので特に@IBOutletを使う際などはおすすめです。

投稿2017/10/16 07:18

FujiiYosuke

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問