2017-05-24 12 views
0

@IBOutletsuper.awakeFromNib()の後で初期化されていましたが、それはnilですか?awakeFromNibの@IBOutletは初期化されていません

再現手順:

  1. は、新しいサブのUIViewを作成します。 MyView
  2. UIViewを作成し、「ファイルの所有者」を「MyView」に設定します。
  3. UIViewControllerのビューのストーリーボードで、「カスタムクラス」をMyViewに設定します。
  4. @IBOutlet
  5. これでエラーが発生します。 4.

更新:
ストーリーボードを直接使用している場合は、これが機能します。

  1. サブUIViewを作成します。 MyView
  2. ストーリーボードでは、UIViewControllerビューにラベルを追加します。 MYVIEW
  3. へのUIViewControllerのビューセット「カスタムクラス」のストーリーボードで
  4. この作品@IBOutlet
  5. を接続します。

    import UIKit 
    
    class MyView: UIView { 
    
    @IBOutlet weak var myLabel: UILabel! 
    
    override func awakeFromNib() { 
        super.awakeFromNib() 
        self.myLabel.text = "Hello world" 
    } 
    
    override func didMoveToSuperview() { 
        self.myLabel.text = "Hello world" 
    } 
    
    override func layoutSubviews() { 
        self.myLabel.text = "Hello world" 
    } 
    
    override func didMoveToWindow() { 
        self.myLabel.text = "Hello world"   
    } 
    
    } 
    
+1

コンセントが接続されていますか? – Oskar

+0

同じ:致命的なエラー:アンラッピング中に予期せず見つかったオプション値 –

+0

誰がナビゲーションバーを所有していますか?それがトップレベルのnibオブジェクトの場合は、強い参照をそれに接続する必要があります。そうでなければ、awakeFromNibに到達するまでに割り当てが解除されます。 – Darren

答えて

0

ストーリーボードはxibsをロードしません。ビュー内でxibを明示的に読み込む必要があります。ストーリーボードはinit(coder:)を使用してビューを作成します。

func loadNib() -> UIView? { 
    guard 
     let nibName = NSStringFromClass(type(of: self)).components(separatedBy: ".").last, 
     let bundle = Bundle(for: type(of: self)) 
     let views = bundle.loadNibNamed(nibName, owner: self, options: nil), 
     let contentView = views.first as? UIView 
    else { 
     return nil 
    } 

    return contentView 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 

    let contentView = self.loadNib()! 
    self.addSubview(contentView) 
    contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight] 
    contentView.frame = self.bounds 
} 

これは、ビューに追加し、XIBのルートビューをロードします。所有者にselfを渡すので、アウトレットが接続されます。

関連する問題