从xib加载自定义视图后,IBOutlet属性为零

Gra*_*lex 26 uiview nib ios swift

IBOutlets发生了一些奇怪的事情. 在此输入图像描述

在代码中我尝试访问这些属性,但它们是nil.码:

class CustomKeyboard: UIView {

    @IBOutlet var aButt: UIButton!
    @IBOutlet var oButt: UIButton!

    class func keyboard() -> UIView {
        let nib = UINib(nibName: "CustomKeyboard", bundle: nil)
        return nib.instantiateWithOwner(self, options: nil).first as UIView
    }

    override init() {
        super.init()
        commonInit()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }

    // MARK: - Private
    private func commonInit() {
        println(aButt)
        // aButt is nil

        aButt = self.viewWithTag(1) as UIButton
        println(aButt)
        // aButt is not nil
    }
}
Run Code Online (Sandbox Code Playgroud)

fz.*_*fz. 52

这是预期的,因为在初始化程序被调用时没有分配IBOutlet.您不需要commonInit,只需覆盖awakeFromNib,如下所示:

override func awakeFromNib() {
    super.awakeFromNib()

    print(aButt)
}
Run Code Online (Sandbox Code Playgroud)

  • 已经有了...仍然收到错误。此外,我的插座显示为已连接,班级在 xib 中匹配。即使使引用类型强大,仍然没有。 (4认同)
  • @MarceloRibeiro,您必须执行以下操作:```覆盖func awakeAfter(使用aDecoder:NSCoder)->可以吗?{guard subviews.isEmpty else {return self} return Bundle.main.loadNibNamed(“ MainNavbar”,owner:nil,options:nil)?. first}` (2认同)

Sco*_*des 6

假设您尝试了连接 IBOutlets 的标准故障排除步骤,请尝试以下操作:

显然,您需要在某些运行时情况下禁用从 nib 唤醒。

  override func awakeAfter(using aDecoder: NSCoder) -> Any? {
      guard subviews.isEmpty else { return self }
      return Bundle.main.loadNibNamed("MainNavbar", owner: nil, options: nil)?.first
  }
Run Code Online (Sandbox Code Playgroud)