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

4
我正在尝试使用我创建的自定义视图。
我使用从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

感谢 :)

1
请添加一个截图,展示如何将LoginView.xib连接到LoginView.swift。可能会出现一些问题。 - Usman Javed
3个回答

7

1
从你的示例中并不清楚(下次请提供整个文件,而不仅仅是其中的部分),但看起来你正在试图从LoginView本身实例化LoginView。
"init() -> setup() -> loadViewFromNib() -> init() -> ..."。
问题在于"instantiate"将调用LoginView的init()方法,这将再次调用loadViewFromNib()。我希望你现在看到了问题。
你想用loadViewFromNib做什么?
编辑:在第二张图片的右上角有一个“自定义类”部分。在那里,“类”字段中必须提供您的控制器名称(例如LoginViewController)。这样,您就连接了视图和控制器,并且不需要那个导致问题的自定义loadViewFromNib方法。

是的,没错。我无法让它可见。我在Storyboard上看不到自定义控制器,也无法在运行应用程序时看到它。 - Shefy Gur-ary

0

对于遇到这个问题的任何人,如果您为表格或集合视图注册了一个 Nib,则是在告诉父视图在需要出列单元格时加载名为“x”的 Nib。

通常使用 Nib 代码时,您需要编写一个方法来加载实际的 XML,以将其与 Nib 类绑定,但是当您注册可重用视图时,您的注册意味着父视图负责执行此操作。它会为您加载一个 XML 文件,并尝试在您进行强制转换时将其与类绑定。在其中添加另一个 loadNib 调用将导致发生无限循环。

您只需要将单元格 Nib 的类设置为您的自定义类,然后注册它,它将为您处理可重用单元格 - 从单元格内部的任何初始化器中删除 loadNib 方法,并在集合或表视图类上添加注册代码即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接