处理作为文件所有者的对象的 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.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 的 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 作为模型