我知道有很多相关的问题,为什么在实例化某些视图时没有调用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的文件所有者本身为customView
。
更多编辑:
自定义视图类是这样的。实际上awakeFromNib()
没有被调用。
final class MyCustomView: BaseCustomView {
override func awakeFromNib() {
// do something
}
}
答案 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中的任何其他方法