コードで背景を設定した後、Storyboard上のUIButtonが隠れないように前面に持って行こうとしています。
こちらを参考に進めているのですが、ビルドし該当するページに入ろうとすると
self.view.bringSubviewToFront(btn)
のところで
fatal error: unexpectedly found nil while unwrapping an Optional value
が出てしまいます。
self.view.bringSubviewToFront(btn)
の部分を記述せずにビルドを行うと背景画像が設定され正常に動作する状態です。
Swift
1import UIKit 2 3class HomeViewController: UIViewController { 4 5 @IBOutlet weak var btn: UIButton! 6 7 var image: UIImage = UIImage(named: "IMG_6599.png")! 8 var ImageView: UIImageView = UIImageView(frame: CGRect(x: 0,y: 0,width: 750,height: 1334)) 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 self.title = "home" 14 15 self.view.backgroundColor = UIColor.cyan 16 17 ImageView.image = image 18 ImageView.layer.position = CGPoint(x: self.view.bounds.width / 2,y: self.view.bounds.height / 2) 19 20 21 self.view.addSubview(ImageView) 22 23 self.view.bringSubviewToFront(btn) 24 self.view.sendSubviewToBack(ImageView) 25 } 26 27 28 }
また、Storyboard上の部品はこのようになっております。
遷移前のViewControlerでは下記のように記述しております。
Swift
1 // ボタンを用意 2 var addBtn: UIBarButtonItem! 3 4 override func viewDidLoad() { 5 super.viewDidLoad() 6 7 // タイトルを付ける 8 self.title = "chat" 9 10 // addBtnを設置 11 addBtn = UIBarButtonItem(barButtonSystemItem: .reply, target: self, action: #selector(onClick(_:))) 12 self.navigationItem.leftBarButtonItem = addBtn 13} 14 15 // addBtnをタップしたときのアクション 16 @objc func onClick(_ sender: UIBarButtonItem) { 17 print("ボタンタップ") 18 let home = HomeViewController() 19 self.navigationController?.pushViewController(home, animated: true) 20 }
btnのアウトレットは繋がっていますか?
print(btn) が nil なら繋がっていないので繋いで下さい。
StorybordとのOutlet接続がされていることは確認しました。
print(btn) で確認して下さい。
ページを開くときにnilが出てしまっているので接続されてないようです。
接続の方法を教えていただけないでしょうか。
btn の Connections inspector を確認して下さい。
質問を編集しConnections inspectorの画像を追加したので、確認していただくことは可能でしょうか。
Storyboard上の btn ってUILabelじゃないですか?
確認したところUIButtonでした
UIButtonであることを確認できるスクショを追加して下さい。
画像追加したので、確認していただけますか。
ごめんなさい、分からないです。
もう少し時間をかけて解決方法を探ってみます。
お時間いただきありがとうございました。
> ページを開くときにnilが出てしまっている
別画面から遷移しているのでしょうか。それに該当するコードがあれば質問本文追記ください。
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さん
????
解決の糸口になってよかったです
@fuzzballさん
さすがです!
@shisen-tさん
アウトレットがうまく接続出来ていない場合も、同様のエラーが発生するので覚えておくとよろしいかと思います。(原因はほぼ二択です)
回答1件
あなたの回答
tips
プレビュー