Infinite l oop пытается создать пользовательский вид из XIB в Swift 5 с помощью бета-версии Xcode 11 - PullRequest
0 голосов
/ 22 января 2020

Я хочу создать повторно используемую среду пользовательского интерфейса в Swift 5, используя Xcode 11 beta. Мой класс Framework:

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!!!!")
    }
}

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 22 января 2020

Когда вы вызываете Bundle.main.loadNibNamed в вашем методе setUpView, представление загружается из пера, и поэтому вызывается awakeFromNib, что, в свою очередь, вызывает setUpView, что приводит к бесконечному l oop.

Я не уверен, почему вам нужно загрузить только представление контента из пера, а затем добавить его в качестве подпредставления вместо загрузки всего пользовательского представления из пера. Но если вы настаиваете так, по крайней мере, после загрузки представления содержимого из nib, установите переменную экземпляра, скажем, возможно contentView: View?, в представление загруженного содержимого. И добавьте проверку в setUpView, где, если представление содержимого не равно nil, просто верните.

И перо, которое вы загружаете в свой setUpView, поскольку оно предназначено только для просмотра содержимого, должно определенно не быть self.nib

...