【发布时间】: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的实现。因此,说它没有被调用是没有意义的。它没有被调用,因为它不存在。或者,如果它在那里,显示它(并显示“那里”在哪里)。 -
我编辑了。够了吗?
标签: ios cocoa-touch awakefromnib