awakeFromNib中的@IBOutlet未初始化

时间:2017-05-24 14:55:12

标签: ios swift

我很确定@IBOutlet之后super.awakeFromNib()被初始化了,但它是零?

重现的步骤:

  1. 创建一个新的子UIView; MyView的
  2. 创建.xib UIView并设置"文件所有者"到" MyView"
  3. 在故事板中的UIViewController的视图集" Custom Class"到MyView。
  4. 连接@IBOutlet
  5. 这会给你错误。 4。
  6. 更新:
    如果您直接使用Storyboard,这确实有效。

    1. 创建一个子UIView; MyView的
    2. 在Storyboard UIViewController视图中添加标签。
    3. 在故事板中的UIViewController的视图集" Custom Class"到MyView
    4. 连接@IBOutlet
    5. 这样做。

      import UIKit
      
      class MyView: UIView {
      
      @IBOutlet weak var myLabel: UILabel!
      
      override func awakeFromNib() {
          super.awakeFromNib()
          self.myLabel.text = "Hello world"
      }
      
      override func didMoveToSuperview() {
          self.myLabel.text = "Hello world"
      }
      
      override func layoutSubviews() {
          self.myLabel.text = "Hello world"
      }
      
      override func didMoveToWindow() {
          self.myLabel.text = "Hello world"        
      }
      
      }
      

1 个答案:

答案 0 :(得分:2)

Storyboard不会加载xib。您必须在视图中明确加载xib。故事板使用init(coder:)

创建视图
func loadNib() -> UIView? {
    guard
        let nibName = NSStringFromClass(type(of: self)).components(separatedBy: ".").last,
        let bundle = Bundle(for: type(of: self))
        let views = bundle.loadNibNamed(nibName, owner: self, options: nil),
        let contentView = views.first as? UIView
    else {
        return nil
    }

    return contentView
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    let contentView = self.loadNib()!
    self.addSubview(contentView)
    contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    contentView.frame = self.bounds
}

这将加载xib的根视图,将其添加到视图中。由于我们将self作为所有者,因此网点将被连接。