我试图使用我创建的自定义视图。
我使用来自nib的实例化,但它会导致无限循环,我不确定如何修复。有什么想法吗?
以下是运行结果的图像:
以下是导致此问题的代码:
// MARK: - Init & Setup
// Needed for IBDesignable
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
func setup(){
view = loadViewFromNib()
view.frame = bounds
view.autoresizingMask = UIViewAutoresizing(rawValue: UIViewAutoresizing.RawValue(UInt8(UIViewAutoresizing.flexibleWidth.rawValue) | UInt8(UIViewAutoresizing.flexibleHeight.rawValue)))
addSubview(view)
}
func loadViewFromNib() -> UIView{
let bundle = Bundle(for:type(of: self))
let nib = UINib(nibName: "LoginView", bundle: bundle) // TEST: changin bundle from bundle-> nil
let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
return view
}
编辑:此处是连接图片
谢谢:)
答案 0 :(得分:2)
快速解答:
由于Xib的顶级视图的custom class
设置为YourCustomeView,因此xib加载过程loadViewFromNib
将再次调用您的initWithCoder
方法⛔️?♽。
快速修复:
在Xib中,不要将视图的自定义类设置为YourCustomeView,而是将YourCustomeView设置为Xib的The File Owner
。
更多信息 https://medium.com/@anandin02/loading-custom-views-in-ios-the-right-way-bedfc06a4fbd
答案 1 :(得分:1)
从您的示例中不清楚(请下次提供整个文件,而不仅仅是部分文件),但看起来您正试图从自身实例化LoginView。
init() -> setup() -> loadViewFromNib() -> init() -> ...
问题是instantiate
将调用LoginView的init()方法,该方法将再次调用loadViewFromNib()。我希望你现在能看到问题。
你想用loadViewFromNib做什么?
编辑:在第二张图片的右上角有一个"自定义类"部分。那里,在"类"你需要提供控制器的名称(LoginViewController或类似的东西)。通过这种方式连接视图和控制器,您不需要导致问题的自定义loadViewFromNib方法。
答案 2 :(得分:0)
对于有此问题的任何人,如果您为表视图或集合视图注册一个Nib,则是告诉该父视图在需要出队的时候去加载一个名为“ x”的Nib。
通常使用Nib代码,您需要一种方法来加载实际的XML,该XML使您的布局将其绑定到Nib类,但是当您注册可重用视图时,您的注册意味着父视图负责为此。它将按字面意义为您加载XML文件,并在投射时尝试将其绑定到类。通过在其中添加另一个loadNib
调用,将导致无限循环的发生。
您需要做的就是将单元格Nib的类设置为您的自定义类,注册它,它将为您完成可重复使用的单元格的其余工作-从单元格内部的所有初始化程序中删除loadNib
方法并添加注册集合或表视图类上的代码。