2017-09-18 9 views
1

次のコードを確認してください。なぜUILabel()はnilを返しますか?

fatal error: unexpectedly found nil while unwrapping an Optional value 

UILabelは()nilを返す理由をすべてのアイデア:次のエラーでself.title.textColor = .white

class MyViewCell: UICollectionViewCell { 
    @IBOutlet weak var title: UILabel! 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     didLoad() 
    } 

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

    /// Common init code. 
    func didLoad() { 
     self.title = UILabel() 
     self.title.textColor = .white 
     ... 
    } 
} 

マイアプリのクラッシュ?

答えて

4

弱い参照に直接割り当てを行い、その時点で強い所有参照がないため、弱い参照が直ちに削除されます。次の行でそれにアクセスすると、あなたのクラッシュの原因となるゼロを打つことになります。!

func didLoad() { 
    let label = UILabel() 
    // Configure the label... 
    self.view.addSubview(label) 
    // A view retains its subviews, so now you can assign to the weak reference 
    self.title = label 

} 

しかし、あなたの変数は本当にそのコンセントの場合:あなたは何か他のものは、あなたがビューに追加例えば、それを保持するまでスコープにラベルを維持しますローカル変数を作成する必要があり

ストーリーボードに設定されている場合は、実際にはinitでコーダーを使用しないでください。これは、ストーリーボードがコンセントに保持しているものであれば上書きされるためです。

+0

この行を必要といけないことを確認してください。私の悪い。私は疲れていなければならない。ありがとうたくさん:) –

-1

はあなたのIBOutletは、ストーリーボード/ XIB

に接続されます。また、もちろん

self.title = UILabel() 
+1

あなたが言うラインは、質問の中心にある必要はありません。あなたは、OPがストーリーボードにラベルを作成したと仮定していますが、そうではありません。 *問題の行が 'self.title'にラベルを割り当てるとすれば、なぜ' self.title'は次の行にnilですか? jrturtonの答えはこれをカバーしています。 – Caleb

+0

@Caleb大丈夫です。私の答えは間違っていますが、インターフェースビルダーを使用している場合はIBOutletsが使用されています。だから私は仮定しませんでした。その正しい実装。 plsはAppleのドキュメントとこのスレッドをチェックします:https://stackoverflow.com/a/1643039/6298923、https://developer.apple.com/library/content/documentation/General/Conceptual/Devpedia-CocoaApp/Outlet.html – dhin

+0

私はアウトレットに精通しています。 '@ IBOutlet'プロパティをマークすると、Interface Builderで利用できるようになりますが、IBでプロパティを接続する必要があるわけではなく、他の手段で設定することもできません。なぜ@BOututletが最初にストーリーボードの問題を考えるようになったのかを確かめることができますが、OPの質問への答えは本当に次の修飾子、すなわち「弱い」にあります。 – Caleb

関連する問題