处理文件所有者

时间:2017-07-28 09:52:44

标签: ios cocoa-touch awakefromnib

我知道有很多相关的问题,为什么在实例化某些视图时没有调用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
    }

}

2 个答案:

答案 0 :(得分:0)

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

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

}是没有意义的。

答案 1 :(得分:0)

基于Josh和Kazuya的评论,xib中的File Owner显然位于Placeholder下,而正是这样,一个占位符,供编译器知道该xib上有一个ivar,该ivar将在内存中有一个对象可以连接一次xib被实例化。实际上,如果将其保留为空白,则AppDelegate拥有它。我认为File的Owner现在在IB中已经过时了。

在右侧的检查器中,如果将“文件的所有者”->“自定义类”->“类”设置为MyCustomView,但未将“ XIB”顶级层次结构UIView的类设置为“ MyCustomView”,则IBOutlet将赢得不会被连接,而不会调用awakeFromNib()。

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

WhereToSet_MyCustomViewClass