gpt4 book ai didi

ios - awakeFromNib 中的@IBOutlet 未初始化

转载 作者:搜寻专家 更新时间:2023-11-01 06:33:45 25 4
gpt4 key购买 nike

我很确定 @IBOutlet 是在 super.awakeFromNib() 之后初始化的,但它是 nil?

重现步骤:

  1. 创建一个新的子 UIView;我的 View
  2. 创建一个 .xib UIView 并将“File's Owner”设置为“MyView”
  3. 在 Storyboard中的 UIViewController View 中,将“自定义类”设置为 MyView。
  4. 连接@IBOutlet
  5. 这会给你错误。 4.

更新:
如果您直接使用 Storyboard ,这确实有效。

  1. 创建一个子 UIView;我的 View
  2. 在 Storyboard UIViewController View 中添加一个标签。
  3. 在 Storyboard中的 UIViewController View 中,将“自定义类”设置为 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"
    }

    }

最佳答案

Storyboard不加载 xib。您必须在 View 中显式加载 xib。 Storyboard使用 init(coder:) 创建 View :

func loadNib() -> UIView? {
let bundle = Bundle(for: type(of: self))
guard
let nibName = NSStringFromClass(type(of: self)).components(separatedBy: ".").last,
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 的 Root View ,并将其添加到 View 中。由于我们将 self 作为所有者传递,因此将连接网点。

关于ios - awakeFromNib 中的@IBOutlet 未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44161993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com