Pertanyaan UIView subclass di Swift: IBOutlet ditemukan nil saat membuka bungkus


Saya mencoba membuat tampilan kustom di Swift dengan subclassing UIView, dan saya memiliki papan tampilan bernama MyViewPanel.xib yang kelasnya ditugaskan untuk MyCustomView. Implementasinya adalah sebagai berikut:

import UIKit
@IBDesignable
class MyCustomView: UIView {
 @IBOutlet weak var title: UILabel!

 var question: Question {
     didSet {
        print("did set question, title is: \(question.title)")
     }
 }

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


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

override func drawRect(rect: CGRect) {
        let height = rect.height
        let width = rect.width
        let color: UIColor = UIColor.whiteColor()

        let drect = CGRect(x: (width * 0.25), y: (height * 0.25), width: (width * 0.5),height: (height * 0.5))
        let bpath: UIBezierPath = UIBezierPath(rect: drect)
        color.set()
        bpath.stroke()
    }

override func awakeFromNib() {
        super.awakeFromNib()
        print("awake from nib!")
        self.title.text = "Test title" // error: found nil while unwrapping an Optional Value 
    }
}

Selama waktu proses, saya mengalami kesalahan berikut:

fatal error: unexpectedly found nil while unwrapping an Optional value

Sejak itu awakeFromNib() adalah acara siklus hidup pertama di UIView, Saya tidak mengerti mengapa title UILabel tidak ada dalam kasus ini.

Edit:

Untuk menggunakan tampilan kustom ini, saya hanya menggambar a UIView persegi panjang di storyboard saya dan tetapkan kelasnya MyCustomView. Dalam viewDidLoad() metode saya ViewController untuk storyboard, saya menetapkan pertanyaan pada tampilan khusus:

override func viewDidLoad() {
   // myCustomView is an IBOutlet in the view controller
   myCustomView.question = question
}

5
2018-01-09 23:16


asal


Jawaban:


Bagian kode terlihat OK tapi ini akan menunjukkan outlet belum terhubung dengan benar di pembuat antarmuka. Di bagian outlet di pembuat antarmuka, Anda dapat melihat outlet judul tersambung dan tidak menunjukkan tanda seru yang menunjukkan kesalahan. Juga garis IBOutlet dalam kode harus memiliki lingkaran diisi di sebelahnya untuk menunjukkan outlet terhubung dengan benar dan kelas dengan benar ditugaskan dari pembuat antarmuka.


1
2018-01-10 02:48



Saya menemukan cara untuk mengatur teks untuk UILabel dalam penginisialisasi yang mudah untuk subclass UIView yang saya tulis:

@IBOutlet weak var messageLabel: UILabel!

init?(frame: CGRect, message: String) {
    super.init(frame: frame)

    guard let view = NSBundle.mainBundle().loadNibNamed("MyViewSubclass", owner: self, options: nil).first as? MyViewSubclass else {
        return nil
    }

    // Without the following line, my view was always 600 x 600
    view.frame = frame

    self.addSubview(view)

    guard let messageLabel = view.messageLabel else {
        return
    }

    messageLabel.text = message
}

1
2017-07-08 23:06



Ini terjadi pada saya dengan instantiating pandangan saya seperti ini

MyCustomView()

bukannya instantiate dari storyboard

UIStoryboard.init(name: "name", bundle: nil).instantiateViewController(withIdentifier: "identifier")

-1
2017-11-03 13:32