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

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

ただいまの
回答率

89.23%

fatal error: unexpectedly found nil while unwrapping an Optional valueを解決したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 448

shisen-t

score 21

コードで背景を設定した後、Storyboard上のUIButtonが隠れないように前面に持って行こうとしています。

こちらを参考に進めているのですが、ビルドし該当するページに入ろうとすると
self.view.bringSubviewToFront(btn)
のところで
fatal error: unexpectedly found nil while unwrapping an Optional value
が出てしまいます。

self.view.bringSubviewToFront(btn) 
の部分を記述せずにビルドを行うと背景画像が設定され正常に動作する状態です。

import UIKit  

class HomeViewController: UIViewController {      

 @IBOutlet weak var btn: UIButton!     

  var image: UIImage = UIImage(named: "IMG_6599.png")!   
  var ImageView: UIImageView = UIImageView(frame: CGRect(x: 0,y: 0,width: 750,height: 1334))       

 override func viewDidLoad() {    
    super.viewDidLoad() 

    self.title = "home"    

    self.view.backgroundColor = UIColor.cyan 

    ImageView.image = image 
    ImageView.layer.position = CGPoint(x: self.view.bounds.width / 2,y: self.view.bounds.height / 2)   


    self.view.addSubview(ImageView)

    self.view.bringSubviewToFront(btn)         
    self.view.sendSubviewToBack(ImageView)    
 }    


 }


現在のOutlet接続はこのようになっております。
イメージ説明
イメージ説明

また、Storyboard上の部品はこのようになっております。
イメージ説明

遷移前のViewControlerでは下記のように記述しております。

  // ボタンを用意
    var addBtn: UIBarButtonItem!

    override func viewDidLoad() {
        super.viewDidLoad()

            // タイトルを付ける
            self.title = "chat"

            // addBtnを設置
        addBtn = UIBarButtonItem(barButtonSystemItem: .reply, target: self, action: #selector(onClick(_:)))
            self.navigationItem.leftBarButtonItem = addBtn
}

    // addBtnをタップしたときのアクション
    @objc func onClick(_ sender: UIBarButtonItem) {
        print("ボタンタップ")
        let home = HomeViewController()
        self.navigationController?.pushViewController(home, animated: true)
    }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • xenbeat

    2019/05/31 03:22

    > ページを開くときにnilが出てしまっている

    別画面から遷移しているのでしょうか。それに該当するコードがあれば質問本文追記ください。

    キャンセル

  • fuzzball

    2019/05/31 09:33

    let home = HomeViewController()

    これだとStoryboardから生成していることになりません。

    instantiateInitialViewController()
    https://developer.apple.com/documentation/uikit/uistoryboard/1616213-instantiateinitialviewcontroller

    instantiateViewController(withIdentifier:)
    https://developer.apple.com/documentation/uikit/uistoryboard/1616214-instantiateviewcontroller

    などを使って、Storyboardから生成して下さい。

    @xenbeatさん
    👍

    キャンセル

  • xenbeat

    2019/05/31 11:42

    解決の糸口になってよかったです

    @fuzzballさん
    さすがです!

    @shisen-tさん
    アウトレットがうまく接続出来ていない場合も、同様のエラーが発生するので覚えておくとよろしいかと思います。(原因はほぼ二択です)

    キャンセル

回答 1

check解決した方法

+1

   // addBtnをタップしたときのアクション
    @objc func onClick(_ sender: UIBarButtonItem) {
        print("ボタンタップ")
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let nextView = storyboard.instantiateViewController(withIdentifier: "home")
        let navi = UINavigationController(rootViewController: nextView)
        present(navi, animated: true, completion: nil)
    }

と書き換えることで解決しました。
きちんとStoryboardから生成しなくてはならないことを見落としていました。

fuzzballさん、xenbeatさんありがとうございました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 89.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる