2017-07-28 28 views
0

我知道有很多相关的问题,为什么awakeFromNib在实例化某些视图时未被调用。 某些视图从Nib唤醒的消息被发送到视图本身,并且此消息未传递给文件所有者。 我看到了Why won't my awakeFromNib fire?处理文件的所有者对象awakeFromNib

那么,如果您创建一个视图的实例,其文件所有者本身在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的文件所有者本身是customView。编辑: 自定义视图类是这样的。实际上并没有调用awakeFromNib()

final class MyCustomView: BaseCustomView { 

    override func awakeFromNib() { 
    // do something 
    } 

} 
+0

你能告诉你如何实例化MyCustomView吗?我想如果你直接创建一个'MyCustomView.swift'的实例,它将不会被调用,一些'init'将被调用。 – zero

+0

我展示了几乎所有的代码,请参阅。 –

+0

在你显示的代码中没有'awakeFromNib'的实现。因此说它没有被调用是没有意义的。它没有被叫,因为它不在那里。或者,如果它在那里,_show_它(并显示“there”在哪里)。 – matt

回答

0

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

所以,文件的所有者并没有像其他对象一样从笔尖“醒来”。它在之前被创建笔尖被解除存档。因此,收到awakeFromNib并不合理。

+0

是的,文件所有者对象是Apple官方文档描述的唯一占位符。所以,File's Owner不是从Nib中唤醒的。但是,在我的代码中,'view'对象确实是从Nib唤醒的。所以,我认为'awakeFromNib()'应该被调用。所以,在我自己,我有两个对象。一个是文件的所有者,另一个是查看。当启动File's Owner时,不调用'awakeFromNib()'。另一方面,在执行视图时,应该调用'awakeFromNib()'。 –