我制作了一个带有一些插座的自定义UIView XIB文件。我希望能够以编程方式从代码中的其他位置加载它。我在xib中使用自动布局。我的问题是我需要使用参数值初始化它以满足委托方法。我不确定如何在初始化期间传递参数。我也不太了解整个init(frame :) vs init(coder :)以及便捷的init在这里如何工作。有什么建议吗?
背景:目前,整个视图在Obj-C中都是程序化的,我正迅速将其移植到XIB。
答案 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