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

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

1回答

2178閲覧

[swift]NavigationController での画面遷移で遷移先の IBOutlet が nil になる

nnsuke24

総合スコア25

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クリップ

投稿2018/12/26 10:58

前提・実現したいこと

navigationControllerをしており画面遷移の際に、遷移元画面の入力フォームに記入された値を、遷移先のViewControllerに渡したいと思っています。
しかし、遷移先のViewControllerのIBOutletプロパティがnilになってしまいます。

構成としては下記の通りです。

遷移元ViewController

  • navigationControllerを使用
  • TableViewControllerでstatic cellを使用
  • static cellの中にTextFieldとButtonを配置
  • コードで生成したButtonをタップした際に画面遷移(コードで記述)

遷移先ViewController

  • navigationControllerを使用
  • TableViewControllerでstatic cellを使用
  • IBOutlet(Label)はstatic cellの要素

発生している問題・エラーメッセージ

Fatal error: Unexpectedly found nil while unwrapping an Optional value

該当のソースコード

遷移元 ViewController1

swift

1import UIKit 2 3class ViewController1: UITableViewController { 4 5 @IBOutlet var tableView: UITableView! 6 var cell: UITableViewCell! 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 } 11 12 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 13 14 cell = super.tableView(tableView, cellForRowAt: indexPath) 15 16 // 入力フォームView 17 let frame = CGRect(x: 0, 18 y: 0, 19 width: self.view.frame.width, 20 height: self.view.frame.height) 21 let editView = EditView(frame: frame) 22 cell.contentView.addSubview(editView) 23 24 // 確認ボタン 25 let nextButtonFrame = CGRect(x: 16.0, 26 y: editView.bounds.height, 27 width: self.view.frame.width, 28 height: 44.0) 29 let nextButton = UIButton(frame: nextButtonFrame) 30 nextButton.addTarget(self, action: #selector(pushNextButton(_:)), for: .touchUpInside) 31 cell.contentView.addSubview(nextButton) 32 33 return cell 34 } 35 36 @objc func pushNextButton(_ sender: UIButton) { 37 // ここで遷移先のViewControllerを作成しています 38 let storyboard = UIStoryboard(name: "ViewController2", bundle: Bundle.main) 39 guard let vc = storyboard.instantiateInitialViewController() as? ViewController2 else { 40 fatalError("no exist ViewController2") 41 } 42 43 // 入力フォームのオブジェクトを取り出します 44 let editView = cell.contentView.subviews[0] as? EditView 45 guard sessionEditView != nil else { 46 fatalError("no exist cell") 47 } 48 49     // 入力フォームのテキストフィールドに入力されたテキストを遷移先に渡そうとするが 50 // ここでtitleLabelがnilになる 51 vc.titleLabel.text = editView?.titleTextField.text 52 53 navigationController?.pushViewController(vc, animated: true) 54 } 55}

遷移先 ViewController2

swift

1import UIKit 2 3class ViewController2: UITableViewController { 4 5 // MARK: - IBOutlet Properties 6 @IBOutlet weak var titleLabel: UILabel! 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 // Do any additional setup after loading the view. 12 } 13} 14

補足情報

swift4
Xcode10.2

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

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

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

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

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

guest

回答1

0

まだviewが生成されていません。例えば、

swift

1print(vc.titleLabel) //nil 2vc.view.frame = .zero 3print(vc.titleLabel) //not nil

などと、適当な刺激を与えてやればviewが生成されます。(print(vc.view)とかでもいけます)

正しい刺激の与え方があったかどうか覚えてないので、裏技的ではなく正攻法を書いておくと、直接ラベルに値を入れるのではなく、一旦変数に渡しておいて、ViewController2のviewDidLoadでラベルに設定すればいいと思います。

投稿2018/12/27 00:43

fuzzball

総合スコア16731

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問