IBOutlets Xib возвращают ноль при использовании Xib в раскадровке - PullRequest
0 голосов
/ 11 апреля 2019

Я создал представление, используя Interface Builder в качестве xib. Я сделал это, так как хочу дать пользователю возможность увеличивать любое количество этих представлений в контроллере представлений. Я создал представление Xib (с именем «TimeRangeView.xib», создал пользовательский класс (с именем «TimeRangeView.swift») и установил класс Xib в этот пользовательский класс, подключил элементы раскадровки к IBOutlets TimeRangeView.swift, установил Владелец файла xib в TimeRangeView.swift и добавил представление с его классом, установленным в мой TimeRangeView.swift в контроллере представления. enter image description here enter image description here

TimeRangeView.swift:

import UIKit

class TimeRangeView: UIView {
    @IBOutlet var startTimeLabel: UILabel!
    @IBOutlet var startDatePicker: UITextField!
    @IBOutlet var endTime: UILabel!
    @IBOutlet var endDatePicker: UITextField!
    @IBOutlet var addButton: UIButton!
    @IBOutlet var maxTimeLabel: UILabel!



    @IBAction func addButtonPressed(_ sender: UIButton) {

    }
}

Раскадровка UIViewController, в которой я использую это, имеет представление Interface Builder в качестве подпредставления; класс этого представления назначен как TimeRangeView.swift. Этот вид связан с контроллером вида как IBOutlet:

@IBOutlet var timeRangeView: TimeRangeView!

В методе viewDidLoad () контроллера представления я хочу изменить некоторые подпредставления TimeRangeView (которые, как мы уже говорили, связаны как IBOutlets), но они возвращают ноль, когда я пытаюсь изменить некоторые из их свойств :

override func viewDidLoad() {
    super.viewDidLoad()
    timeRangeView.maxTimeLabel.text = "Max duration: \(timeString ?? "n/a")"

    //Change the text fields' input views
    let startTimeDatePickerToolBar = UIToolbar().ToolbarPicker(mySelect: #selector(dismissPicker))

    let endTimeDatePickerToolBar = UIToolbar().ToolbarPicker(mySelect: #selector(dismissPicker))

    startTimeDatePicker.setDate(Date(timeIntervalSince1970: NSDate().timeIntervalSince1970 + 60), animated: false)

    endTimeDatePicker.setDate(Date(timeIntervalSince1970: NSDate().timeIntervalSince1970 + 120), animated: false)

    timeRangeView.startDatePicker.inputView = startTimeDatePicker
    timeRangeView.startDatePicker.inputAccessoryView = startTimeDatePickerToolBar
    timeRangeView.startDatePicker.delegate = self

    timeRangeView.endDatePicker.inputView = endTimeDatePicker
    timeRangeView.endDatePicker.inputAccessoryView = endTimeDatePickerToolBar
    timeRangeView.endDatePicker.delegate = self
}

timeRangeView не возвращает ноль; это загрузка. Но при попытке доступа к подпредставлениям timeRangeView (startDatePicker, endDatePicker, maxTimeLabel) все они возвращают ноль.

Я получаю ошибку:

Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

1 Ответ

0 голосов
/ 11 апреля 2019

Это происходит потому, что xib никогда не загружался

Итак, вы можете сделать следующее: сначала добавьте простой UIView в viewController, а не TimeRangeView

@IBOutlet var timeRangeContainerView: UIView!

Теперь в viewDidLoad добавьте Fetch the xib, используя

let timeRangeView = Bundle.main.loadNibNamed("TimeRangeView", owner: self, options: nil)?[0] as? TimeRangeView

И добавить это как подпредставление timeRangeContainerView

override func viewDidLoad() {
    super.viewDidLoad()
    let timeRangeView = Bundle.main.loadNibNamed("TimeRangeView", owner: self, options: nil)?[0] as? TimeRangeView

    timeRangeView.frame = CGRect(origin: CGPoint.zero, size: self.timeRangeContainerView.frame.size)

    self.timeRangeContainerView.insertSubview(timeRangeView, at: 0)

    //  Add constraints
    timeRangeView.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 10).isActive = true
    timeRangeView.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: 0).isActive = true
    timeRangeView.topAnchor.constraint(equalTo: self.topAnchor, constant: 0).isActive = true
    timeRangeView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0).isActive = true
    timeRangeView.translatesAutoresizingMaskIntoConstraints = false  


    //Add the rest of your code here
}

Ограничения являются необязательными

...