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

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

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

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

Xcode

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

Swift

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

Q&A

解決済

2回答

818閲覧

delegateでのUnexpectedly found nil while implicitly unwrapping an Optional valueエラーについて

jabberwocky3376

総合スコア14

iOS

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

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/09/03 12:11

現在、delegateを使ってある画面からボタンを押すと別のstory boardへ遷移するという実装をしたいと考えています。
しかし、Unexpectedly found nil while implicitly unwrapping an Optional valueというエラーが発生し、なかなか解決せず四苦八苦しています。

具体的には、テーブルビューのセルでボタンを配置したビューがあり、そのボタンをタップして画面遷移をしたいと考えています。
ビューで画面遷移のメソッドを定義し、カスタムセルでデリゲートを使ってボタンタップ時にそのメソッドを呼び出し、実装をしようとしています。

viewController

1 2//テーブルビューなどは省略// 3 4 5//画面遷移メソッドを定義 6extension TableViewController: CustomCellDelegate { 7 func buttonDidTap() { 8 let vc = UIStoryboard(name: "OtherViewController", bundle: nil).instantiateInitialViewController()! 9 navigationController?.pushViewController(vc, animated: true) 10 } 11}

customCell

1 2import UIKit 3 4// プロトコルの宣言 5protocol CustomCellDelegate: class { 6 func buttonDidTap() 7} 8 9class CustomCell: UITableViewCell { 10 // 表示させる文字列用label 11 @IBOutlet private weak var product: UILabel! 12 13 var indexPath:IndexPath! 14 15 // delegateの宣言 16 weak var delegate: CustomCellDelegate! 17 18 override func awakeFromNib() { 19 super.awakeFromNib() 20 } 21 22 // labelに文字を設定 23 func setCell(with viewModel: [CellDataModel]?) { 24 if let title = viewModel?[indexPath.row].title { 25 self.product.text = title 26 } 27 } 28 29 //Unexpectedly found nil while implicitly unwrapping an Optional valueエラー発生 30 @IBAction func ButtonAction(_ sender: Any) { 31 delegate.buttonDidTap() 32 } 33}

上記の部分でエラーが発生するのですが、nilではないはずなのにこのエラーが出てしまいます…
以下の内容を試みましたが、解決しておりません

  • StoryboardでRecieved Actionsが紐づいていることは確認済み(消し忘れなどでエラーが発生しているOutletなどもなし)
  • delegate.productButtonDidTap()の部分を、delegate?.productButtonDidTap()に変更したところ、エラーは発生しないが何も起こらなかった(xcodeのコンソールにも何も動きがない)
  • weak var delegate: CustomCellDelegate!を、 weak var delegate: CustomCellDelegate?にしても同じく何も起こらず。
  • 遷移先のStoryboard IDをつけていないからかと思ったが、つけてもエラーが発生した。

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

無事解決いたしました。ありがとうございました。
cellForRowAtでセルを生成して返しているのに、delegateの設定がなく、
ボタンアクションではdelegateで画面遷移を指定しているため、その部分でエラーが発生したのだと思います。
cell.delegate = selfをすることで解決しました。

extension TableViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { var count = 0 if viewModel.dataList?.count ?? 0 > tableView.tag { count = viewModel.dataList?[tableView.tag].count ?? 0 } return count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell cell.indexPath = indexPath cell.setCell(with: viewModel.dataList?[tableView.tag]) // この部分が抜けていました cell.delegate = self return cell } }

投稿2019/09/04 00:38

jabberwocky3376

総合スコア14

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

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

0

ベストアンサー

Unexpectedly found nil while implicitly unwrapping an Optional value

というエラーなので、

Optionalの値(*****?の形のもの)
ex) var name: String? <-これがオプショナルです

を利用しようとしたら、nil(何もない)でしたよってエラーです。

実行した時にどこでコードが止まるんですか?
そのとこの値がnilになっているってことですよ。

そこをnilにならないように修正が必要になります。

追伸
はしょってあって、設定すべき場所が記載されておりませんが、
おそらくコードを見ると

Swift

1weak var delegate: CustomCellDelegate!

があるので、このdelegateの設定を行なっていないからじゃないですか?
TableVIewでCustomCellDelegateの設定を行なっていますか?

他にはsetData: [CellDataModel]? が気になります。
通常配列はオプショナル型にしませんが、、、、
データがない時は0が返り表示されないので、
引数は[CellDataModel]にしてはどうですか?

nilになるというエラーなので、
そこもprintでデータがあるかどうか確認してみてくださいね。

投稿2019/09/03 12:20

編集2019/09/03 12:35
hameji

総合スコア1380

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問