【问题标题】:Infinite loop trying to create a Custom View from xib in swift 5 using Xcode 11 beta无限循环尝试使用 Xcode 11 beta 在 swift 5 中从 xib 创建自定义视图
【发布时间】:2020-01-22 05:51:23
【问题描述】:

我想使用 Xcode 11 beta 在 swift 5 中创建一个可重用的 UI 框架。我的框架类是:

import UIKit

@IBDesignable
open class MyFramework: UIView {

    var view: UIView!
    @IBOutlet weak var helloLabel: UILabel!

    var nibName: String = "MyFramework"

    public override init(frame: CGRect) {
     // For use in code
      super.init(frame: frame)
      setUpView()
    }

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

    override public func awakeFromNib() {
        super.awakeFromNib()
        setUpView()
    }

    private func setUpView() {

        if let contentView = Bundle.main.loadNibNamed(self.nibName, owner: self, options: nil)?.first as? UIView {
            contentView.frame = self.bounds
            self.addSubview(contentView)
            contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
            helloLabel.text = ""
        }
    }

     public func set(helloLabel text: String) {
        self.helloLabel.text = text
    }

    override open func layoutSubviews() {
        super.layoutSubviews()
    }
}

在我的 xib 文件中,我刚刚添加了一个标签。

当我在另一个项目中使用此框架时,我收到 EXC_BAD_ACCESS 错误,因为 setUpView() 调用了无限时间。

import MyFramework

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let view = MyFramework()
        view.set(helloLabel: "Hello World!!!!")
    }
}

请帮助。

【问题讨论】:

    标签: ios xcode11 swift5


    【解决方案1】:

    当您在 setUpView 方法中调用 Bundle.main.loadNibNamed 时,视图会从 nib 加载,因此会调用 awakeFromNib,而后者又会调用 setUpView,并导致无限循环。

    我不知道你为什么只需要从 nib 加载内容视图,然后将其添加为子视图,而不是从 nib 加载整个自定义视图。但是,如果您坚持这样做,至少在从 nib 加载内容视图之后,将一个实例变量设置为可能contentView: View? 到加载的内容视图。并在您的setUpView 中添加一个检查,如果内容视图不为零,则返回。

    您在setUpView 中加载的笔尖,因为它仅用于您的内容视图,绝对不应该是self.nib

    【讨论】:

      【解决方案2】:

      只需将 setupView 移至 init(coder: NSCoder) 方法

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多