Обработка awakeFromNib для объекта, являющегося владельцем файла

Я знаю, что есть много связанных вопросов, почему awakeFromNib не вызывается при создании какого-либо представления. Сообщение о том, что определенный вид пробуждается из Nib, отправляется самому представлению, и это сообщение не доставляется Владельцу файла. Я видел, почему не проснулся мой огонь из Nib?,

Итак, что произойдет, если вы создадите экземпляр представления, владельцем файла которого является сам файл xib?

Другими словами, у вас есть собственный настраиваемый вид с именем MyCustomView.swift и MyCustomView.xib. И в xib-файле вы устанавливаете владельца файла на MyCustomView, Итак, когда вы создаете экземпляр MyCustomViewделает awakeFromNib позвонить? В моем случае awakeFromNib кажется, не называется. Тем не менее, сама точка зрения действительно создана. Так что для меня странно, что awakeFromNib не называется.

Кто-нибудь может объяснить это?

К вашему сведению: я подготовил BaseCustomView.swift,BaseCustomView имеет два init,

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

а также

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

А также commonInit() это так.

private func commonInit() {
        // load custom view's xib
        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: self.className(), bundle: bundle)
        let view = nib.instantiate(withOwner: self, options: nil).first as! UIView
        addSubview(view)

        // make custom view's size the same size with itself
        view.translatesAutoresizingMaskIntoConstraints = false
        let bindings = ["view": view]
        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[view]|",
            options:NSLayoutFormatOptions(rawValue: 0),
            metrics:nil,
            views: bindings))
        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[view]|",
            options:NSLayoutFormatOptions(rawValue: 0),
            metrics:nil,
            views: bindings))
    }

И customView это просто класс, который переопределяет это BaseCustomView, Кроме того, Владелец Файла customView customView сам.

Больше РЕДАКТИРОВАТЬ: пользовательский класс представления похож на это. И на самом деле awakeFromNib() не называется.

final class MyCustomView: BaseCustomView {

    override func awakeFromNib() {
    // do something
    }

}

1 ответ

Элемент "Владелец файла" в кончике немного особенный: он не является реальным объектом в архиве, как другие элементы. Это заполнитель, который заполняется существующим ранее объектом, когда создается экземпляр nib.

Таким образом, владелец файла на самом деле не "пробуждается" от пера, как другие объекты. Он создан до того, как перо не разархивировано. Следовательно, для него не имеет смысла получать awakeFromNib,

Основываясь на комментариях Джоша и Казуи, владелец файла в xib, очевидно, находится в разделе Placeholder, и это именно то, что компилятор должен знать, что на этом xib есть ivar, который будет иметь объект в памяти для подключения после того, как xib будет создан. И на самом деле, если вы оставите это поле пустым, AppDelegate владеет им. На мой взгляд, владелец файла в настоящее время в IB устарел.

В инспекторе с правой стороны, если вы установите File's Owner -> Custom Class -> Class на MyCustomView, но не установите Custom Class -> Class иерархии верхнего уровня xib UIView на MyCustomView, тогда IBOutlet не будет connected и awakeFromNib() не будут вызываться.

Прикрепленное изображение показывает, где ДОЛЖЕН быть установлен MyCustomView, чтобы вызывать любые IBOutlets и awakeFromNib(), а также любые другие методы в MyCustomView.swift.

Другие вопросы по тегам