从nib实例化UIView会导致无限循环问题

时间:2018-03-06 09:06:17

标签: swift xcode swift3 custom-controls nib

我试图使用我创建的自定义视图。

我使用来自nib的实例化,但它会导致无限循环,我不确定如何修复。有什么想法吗?

以下是运行结果的图像:

enter image description here

以下是导致此问题的代码:

// 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
}

编辑:此处是连接图片

enter image description here

谢谢:)

3 个答案:

答案 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方法并添加注册集合或表视图类上的代码。