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

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

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

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

Swift

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

Q&A

解決済

1回答

1812閲覧

collectionViewCellで、xib生成されたあとに呼び出されるメソッド

KazutakaShimizu

総合スコア157

iOS

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

Swift

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

0グッド

0クリップ

投稿2017/06/14 22:59

編集2017/06/15 06:55

現在iosアプリを作っているのですが、表題のようにcollectionViewCellで、xib生成されたあとに呼び出されるメソッドを教えていただきたいです。

やりたいこととしては、collectionViewのcellForItemAtメソッドからcell内の変数に値を渡して、その値をcellのラベルに表示するということなのですが、下記のようにcell内の変数のdidSetで処理を行うと、labelがnilの状態なのでエラーとなってしまいます。

swift

1//セルの処理 2class MenuBarViewCell: UICollectionViewCell { 3 @IBOutlet var label: UILabel! 4 var isCompletedSetUpUI: Bool = false 5 var title:String!{ 6 didSet{ 7 label.text = title 8 } 9 } 10}

swift

1//collectionViewの処理 2class MenuBarView: UIView { 3 var pageTabItemsWidth: CGFloat = 0.0 4 var collectionView:UICollectionView! 5 var titles: [String] = Constant.menuTitle 6 override init(frame: CGRect) { 7 super.init(frame: frame) 8 setUpCollectionView() 9 } 10 11 required init?(coder aDecoder: NSCoder) { 12 fatalError("init(coder:) has not been implemented") 13 } 14} 15 16extension MenuBarView: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { 17 fileprivate func setUpCollectionView(){ 18 let layout = UICollectionViewFlowLayout() 19 layout.itemSize = CGSize(width:100, height:30) 20 layout.scrollDirection = .horizontal 21 collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height), collectionViewLayout: layout) 22 // Cellに使われるクラスを登録. 23 collectionView.delegate = self 24 collectionView.dataSource = self 25 collectionView.showsHorizontalScrollIndicator = false 26 collectionView.register(MenuBarViewCell.self, forCellWithReuseIdentifier: "MyCell") 27 self.addSubview(collectionView) 28 29 } 30 31 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 32 return titles.count * 3 33 } 34 35 /* 36 Cellに値を設定する 37 */ 38 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 39 let cell : MenuBarViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCell",for: indexPath) as! MenuBarViewCell 40 configureCell(cell: cell, indexPath: indexPath) 41 return cell 42 } 43 44 private func configureCell(cell:MenuBarViewCell, indexPath: IndexPath){ 45 let fixedIndex = indexPath.item % titles.count 46 cell.title = titles[fixedIndex] 47 } 48} 49 50extension MenuBarView: UIScrollViewDelegate { 51 func scrollViewDidScroll(_ scrollView: UIScrollView) { 52 if pageTabItemsWidth == 0.0 { 53 pageTabItemsWidth = floor(scrollView.contentSize.width / 3.0) // 表示したい要素群のwidthを計算 54 } 55 56 if (scrollView.contentOffset.x <= 0.0) || (scrollView.contentOffset.x > pageTabItemsWidth * 2.0) { // スクロールした位置がしきい値を超えたら中央に戻す 57 scrollView.contentOffset.x = pageTabItemsWidth 58 } 59 } 60} 61

イニシャライザで行っても同様です。

どなたかご回答いただけると助かります。

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

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

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

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

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

fuzzball

2017/06/15 01:09

nilになること自体がおかしいです。セルの登録、セルの取得(生成)、titleの設定、以上のコードを書いて下さい。
KazutakaShimizu

2017/06/15 06:56

なるほど、ありがとうございます。collectionViewの処理を追記したのでご確認いただけると幸いです。
guest

回答1

0

ベストアンサー

セルの登録をするところ、

swift

1collectionView.register(MenuBarViewCell.self, forCellWithReuseIdentifier: "MyCell")

これだとxibが読み込まれていないと思うので、

swift

1let nib = UINib(nibName: String(describing: MenuBarViewCell.self), bundle: nil) 2collectionView.register(nib, forCellWithReuseIdentifier: "MyCell")

に変更してみて下さい。

ところで、なぜStoryboardではなくxibを使っているのでしょうか?

投稿2017/06/15 07:50

fuzzball

総合スコア16731

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

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

KazutakaShimizu

2017/06/15 08:56

ありがとうございます。 ご指摘いただいた点を修正したところ、問題が解決いたしました。 story boardを使わない理由ですが、一緒に開発しているエンジニアからstory boardは開発に関わる人が増えれば増えるほど不便になると聞いたため、それでは最初から使わず開発しようと思ったためです。 逆に何かstory boardを使うことはどういうったメリットがあるのでしょうか?
fuzzball

2017/06/15 09:07

前回の質問、今回の質問ともに、Storyboardを使っていれば起こらないバグだったので聞いてみただけです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問