如何从XIB将值传递到UIView初始化程序中?

时间:2019-01-31 00:01:32

标签: swift cocoa-touch interface-builder xib

我制作了一个带有一些插座的自定义UIView XIB文件。我希望能够以编程方式从代码中的其他位置加载它。我在xib中使用自动布局。我的问题是我需要使用参数值初始化它以满足委托方法。我不确定如何在初始化期间传递参数。我也不太了解整个init(frame :) vs init(coder :)以及便捷的init在这里如何工作。有什么建议吗?

背景:目前,整个视图在Obj-C中都是程序化的,我正迅速将其移植到XIB。

2 个答案:

答案 0 :(得分:0)

有很多不同的方法来处理视图的初始化。您可以创建一个静态函数来为您完成所有工作。这是避免覆盖init方法的一种方法。

class TestView: UIView {
    var delegate: Any!

    static func instantiate(with delegate: Any) -> TestView {
        let nib = UINib(nibName: "TestView", bundle: nil)
        guard let testView = nib.instantiate(withOwner: nil)[0] as? TestView else {
            fatalError("Attempted to create TestView, failed to find object")
        }
        testView.delegate = delegate
        return testView
    }
}

然后您执行以下操作以创建视图

let testView = TestView.instantiate(with:mydelegate)

答案 1 :(得分:0)

我的解决方案。为我工作!

import Foundation
import UIKit


class NotFoundView: UIView {

    @IBOutlet var contentView: UIView!
    @IBOutlet var lblContentTitle: UILabel!

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

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

    private func customize() {
        print("customize")

        Bundle.main.loadNibNamed("NotFoundView", owner: self, options: nil)
               addSubview(contentView)
               contentView.frame = self.bounds
               contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
    }
}

let notFoundView = NotFoundView()
notFoundView.lblContentTitle.text = "Not found. Please try again..."

return notFoundView