处理文件所有者对象的awakeFromNib

问题描述 投票:0回答:2

我知道有很多相关的问题为什么在实例化某些视图时没有调用awakeFromNib。从Nib唤醒某个视图的消息将被发送到视图本身,并且此消息不会传递给文件所有者。我看到了Why won't my awakeFromNib fire?

那么,如果您创建一个视图的实例,其文件的所有者本身在xib文件中会发生什么?

换句话说,您有自己的名为MyCustomView.swift和MyCustomView.xib的自定义视图。在xib文件中,您将文件的所有者设置为MyCustomView。那么,当你创建MyCustomView的实例时,awakeFromNib会被调用吗?就我而言,awakeFromNib似乎没有被调用。但是,视图本身确实是实例化的。所以,对我来说奇怪的是没有调用awakeFromNib

谁能解释一下这件事?

仅供参考:我准备了BaseCustomView.swiftBaseCustomView有两个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
    }

}
ios cocoa-touch awakefromnib
2个回答
0
投票

笔尖中的“文件所有者”项有点特殊:它不是存档中的真实对象,因为其他项是。这是一个占位符,它填充了一个预先存在的对象when the nib is instantiated

因此,文件的所有者并不像其他对象那样从笔尖“唤醒”。它是在nib未归档之前创建的。因此,它接收awakeFromNib真的没有意义。


0
投票

基于Josh和Kazuya的评论,xib中的文件所有者显然位于占位符下,正是这个,占位符让编译器知道该xib上有一个ivar,它将在内存中有一个对象连接到xib后实例化。实际上如果你把它留空,AppDelegate就拥有它。在我看来,文件的所有者现在在IB中已经过时了。

在右侧的检查器中,如果将文件所有者 - >自定义类 - >类设置为MyCustomView但不将自定义类 - > xib的顶级层次结构UIView设置为MyCustomView,那么IBOutlet将不会connect和awakeFromNib()将不会被调用。

附带的图像显示了MyCustomView必须设置的位置,以便调用任何IBOutlets和awakeFromNib()以及MyCustomView.swift中的任何其他方法

WhereToSet_MyCustomViewClass

© www.soinside.com 2019 - 2024. All rights reserved.