Невозможно создать пользовательский вид с использованием файла Xib из-за отсутствия подвидов - PullRequest
0 голосов
/ 28 августа 2018

У меня есть файл XIB с 5 подпредставлениями. XIB настроен на собственный класс, например,

class Slide: UIView {

    @IBOutlet weak var descriptionImage: UIImageView!
    @IBOutlet weak var descriptionLabel: UILabel!
    @IBOutlet weak var hiLabel: UILabel!
    @IBOutlet weak var loLabel: UILabel!
    @IBOutlet weak var humidityLabel: UILabel!

}

Я создаю инстанцию ​​вот так let slide = Slide()

Когда я пытаюсь установить переменные, т.е. slide.descriptionLabel = "Hello"

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

Поток 1: фатальная ошибка: неожиданно обнаружен ноль при развертывании необязательного значения

Трассировка стека показывает, что XIB создан, но подпредставления равны нулю и, следовательно, не могут быть установлены.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Когда вы работаете с пользовательскими представлениями, используя Xibs, вы должны сначала загрузить их.

Так, например, в вашем классе Slide вы можете создать статическую функцию, например:

static func createView(with owner: Any) -> Slide {
    let nib = UINib.init(nibName: "YourNibName", bundle: nil)
    let views = nib.instantiate(withOwner: owner, options: nil)
    let view = views[0] as! Slide
    view.translatesAutoresizingMaskIntoConstraints = false
    return view
}

где YourNibName должно быть именем вашего файла Xib.

Эта статическая функция может использоваться как:

let slide = Slide.createView(with: self)

// attach the view to a superview
aSuperview.addSubview(slide)

// setup the right constraints
// for example
slide.topAnchor.constraint(equalTo: aSuperview.topAnchor).isActive = true
// ...and so on

Важным моментом является то, чтобы установить в Интерфейсном Разработчике правильное представление для вашей Xib:

enter image description here

Подводя итог, ваш взгляд должен выглядеть следующим образом (обратите внимание, что я переименовал Slide в SlideView. Мне кажется, это лучше):

class SlideView: UIView {
    @IBOutlet var descriptionImage: UIImageView!
    @IBOutlet var descriptionLabel: UILabel!
    @IBOutlet var hiLabel: UILabel!
    @IBOutlet var loLabel: UILabel!
    @IBOutlet var humidityLabel: UILabel!

    static func createView(with owner: Any) -> SlideView {
        let nib = UINib.init(nibName: "YourNibName", bundle: nil)
        let views = nib.instantiate(withOwner: owner, options: nil)
        let view = views[0] as! SlideView
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }
}
0 голосов
/ 29 августа 2018

Это потому, что вы должны загрузить файл пера (здесь я предполагаю, что имя пера Slide )

let slide  = Bundle.main.loadNibNamed("Slide", owner: nil, options: nil)![0] as! Slide

как это

let slide = Slide()

загружает вид без макета, поэтому все присоединенные виды имеют вид nil

...