处理作为文件所有者的对象的 awakeFromNib

Posted

技术标签:

【中文标题】处理作为文件所有者的对象的 awakeFromNib【英文标题】:Handling of awakeFromNib for the object that is File's Owner 【发布时间】:2017-07-28 09:52:44 【问题描述】:

我知道在实例化某些视图时为什么不调用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 的 File's Owner 本身就是customView

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

final class MyCustomView: BaseCustomView 

    override func awakeFromNib() 
    // do something
    


【问题讨论】:

你能说明你是如何实例化MyCustomView 的吗?我认为如果您直接创建MyCustomView.swift 的实例,则不会调用它,而是会调用一些init 我展示了差不多的代码,请看。 您显示的代码中没有awakeFromNib 的实现。因此,说它没有被调用是没有意义的。它没有被调用,因为它不存在。或者,如果它在那里,显示它(并显示“那里”在哪里)。 我编辑了。够了吗? 【参考方案1】:

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

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

【讨论】:

是的,File's Owner 对象只是苹果官方文档中描述的占位符。所以,文件的所有者并没有从 Nib 中唤醒。但是,在我的代码中,view 对象确实是从 Nib 中唤醒的。所以,我认为应该调用awakeFromNib()。所以,在我自己身上,我有两个对象。一个是文件的所有者,另一个是视图。并且在启动 File's Owner 时,不会调用 awakeFromNib()。另一方面,在进行视图时,应该调用awakeFromNib()【参考方案2】:

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

在右侧的inspector中,如果将File's Owner -> Custom Class -> Class设置为MyCustomView,但没有设置Custom Class -> xib的顶层UIView的Class为MyCustomView,则IBOutlet获胜'未连接且不会调用 awakeFromNib()。

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

【讨论】:

以上是关于处理作为文件所有者的对象的 awakeFromNib的主要内容,如果未能解决你的问题,请参考以下文章

当并非所有对象都将被存储时,使用 Core Data 作为模型

数据结构的基本概念

反序列化内存中的 Hadoop 序列文件对象

109:大型CSV文件的处理方式

如何将带有空格的路径作为参数添加到 CreateProcess 批处理文件?

如何将二进制消息作为输入流处理?