IBOutlet пользовательского представления - ноль - PullRequest
0 голосов
/ 28 июня 2018

Итак, у меня есть основной viewController, у которого есть представление стека, к которому я хочу добавить несколько экземпляров пользовательских представлений, которые я создал.

Итак, мой мыслительный процесс заключался в создании пользовательского представления, которое наследуется от UIView. Я хочу, чтобы представление всегда было 40x40, поэтому я создал новый init, чтобы позаботиться об этом? (не уверен, что это правильно):

class QuickAddView: UIView {

    @IBOutlet weak var iconLabel: UILabel!

    var task: Task = Task()

    public init(task: Task) {
        self.task = task
        super.init(frame: CGRect(x: 0, y: 0, width: 40, height: 40))

        configureView()
    }

    private func configureView() {
        self.layer.cornerRadius = self.frame.size.width / 2
        self.backgroundColor = task.color

        configureViewElements()
    }

    private func configureViewElements() {
        configureIconLabel()
    }

    private func configureIconLabel() {
        // CRASH: - iconLabel is nil here
        self.iconLabel.text = task.icon
    }

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

}

У меня тогда есть перо QuickAddView, которое устанавливает свой пользовательский класс на QuickAddView.swift

Наконец, я создаю собственные представления в моем viewController:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    configureViewElements()
}

private func configureViewElements() {
    configureQuickAddStackView()
}

private func configureQuickAddStackView() {
    let quickAddView = QuickAddView(task: Task(name: "Go to the store", icon: "?", color: .purple))

    quickAddStackView.addArrangedSubview(quickAddView)
}

Проблема, с которой я столкнулся, заключается в том, что мой iconLabel равен nil, когда я пытаюсь настроить QuickAddView. Я также не знаю, правильно ли я делаю этот процесс создания пользовательского представления.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Проблема в том, что вы создаете пользовательское представление в коде, но используете IBOutlet для iconLabel. IBOutlet - это то, что вы создали в Интерфейсном Разработчике, а не в коде. Если вы хотите создать QuickAddView в коде, вам также необходимо создать iconLabel в коде в классе QuickAddView. Вам необходимо внести следующие изменения:

weak var iconLabel: UILabel?

private func configureIconLabel() {
    iconLabel = UILabel(frame: CGRect())
    if let iconLabel = iconLabel {
        iconLabel.text = task.icon
        addSubview(iconLabel)
    }
}

Обратите внимание, что я передал обнуляемый CGRect, но вы захотите использовать любой исходный размер и размер UILabels или использовать autolayout для настройки места отображения iconLabel.

0 голосов
/ 28 июня 2018

Поскольку вы подключаете IBOutlet из xibFile, вы должны использовать

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
    configureView()
}

Также в вашем классе вы должны создать его с помощью

if let quickAddView  = Bundle.mainBundle().loadNibNamed("QuickAddView", owner: self, options: nil).first as? QuickAddView {
 quickAddView.task = task
 }
...