0

我知道在实例化某些视图时为什么awakeFromNib不调用许多相关问题。从 Nib 唤醒某个视图的消息被发送到视图本身,并且该消息不会传递给文件的所有者。我看到了为什么我的 awakeFromNib 不会着火?.

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

换句话说,您有自己的自定义视图,名为 MyCustomView.swift 和 MyCustomView.xib。在 xib 文件中,您将文件的所有者设置为MyCustomView. 那么,当您创建 的实例时MyCustomViewawakeFromNib会调用吗?就我而言,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 只是覆盖 this 的类BaseCustomView。另外,customView 的 File 的 Owner 就是customView它自己。

更多编辑:自定义视图类是这样的。实际上awakeFromNib()没有调用。

final class MyCustomView: BaseCustomView {

    override func awakeFromNib() {
    // do something
    }

}
4

2 回答 2

0

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

在右侧的检查器中,如果将 File's Owner -> Custom Class -> Class 设置为 MyCustomView 但未将 xib 的顶级层次结构 UIView 的 Custom Class -> Class 设置为 MyCustomView,则 IBOutlet 不会connected 和 awakeFromNib() 不会被调用。

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

WhereToSet_MyCustomViewClass

于 2019-04-04T16:15:40.897 回答
0

nib 中的“文件所有者”项目有点特殊:它不是档案中的真实对象,就像其他项目一样。它是一个占位符,当 nib 被实例化时,它被一个预先存在的对象填充。

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

于 2017-07-28T12:43:48.340 回答