Swift 从nib加载自定义UIView会导致无限循环或引发nil异常

Swift 从nib加载自定义UIView会导致无限循环或引发nil异常,swift,ios9,xcode7,nib,custom-view,Swift,Ios9,Xcode7,Nib,Custom View,我创建了一个自定义视图(ImageAndToolBarContainerView),其中包含一个对应的XIB文件,我希望将其加载到我应用程序中的多个UIViewController中 我一直在寻找一个合适的教程来教我如何做到这一点,但几乎我遇到的每一个教程要么太老,要么导致了重大的例外 当我尝试通过故事板/NIB加载它时,(我在故事板上的UIViewController中创建了一个视图,并将“Class”属性设置为ImageAndToolBarContainerView。我设置了输出,包括视图,

我创建了一个自定义视图(ImageAndToolBarContainerView),其中包含一个对应的XIB文件,我希望将其加载到我应用程序中的多个UIViewController中

我一直在寻找一个合适的教程来教我如何做到这一点,但几乎我遇到的每一个教程要么太老,要么导致了重大的例外

当我尝试通过故事板/NIB加载它时,(我在故事板上的UIViewController中创建了一个视图,并将“Class”属性设置为ImageAndToolBarContainerView。我设置了输出,包括视图,但调用类时似乎没有加载任何输出,我得到了错误:

致命错误:在展开可选值时意外发现nil

当我尝试访问视图时:

required init?(coder aDecoder: NSCoder)
{
    super.init(coder: aDecoder)
    //setup()
    self.view.frame = self.bounds
    self.addSubview(view)
}
然后,我尝试使用以下代码来加载NIB(通过取消上面setup()函数的注释。setup的代码如下:

func setup()
{
    self.loadViewFromNIB()
    self.view.frame = self.bounds
    self.addSubview(view)
}

func loadViewFromNIB() -> UIView
{
    let bundle = NSBundle(forClass: self.dynamicType)
    let nib = UINib(nibName: "ImageAndToolBarContainer", bundle: bundle)
    let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
    return view
}
这当然会导致一个无限循环

我还有以下函数声明:

override func awakeFromNib()
{
    super.awakeFromNib()
    self.view.frame = self.bounds
    self.addSubview(view)
}

我在这里遗漏了什么?哪里出错了?有没有关于如何正确执行此操作的权威教程?

无限循环可能是由于您设置了文件的所有者,并将视图的类子类化为视图的类名造成的。

对于任何有此问题的人,如果您为表或集合视图注册了Nib,您可以当父视图需要退出单元格队列时,它将启动父视图并加载名为“x”的nib

通常,对于Nib代码,您需要一个方法去加载实际的XML,使您的布局将其绑定到Nib类,但是当您注册一个可重用视图时,您的注册意味着父视图负责执行此操作。它将直接为您加载一个XML文件,并在您转换它时尝试将其绑定到一个类将另一个
loadViewFromNIB
调用放入其中,将导致无限循环发生


您只需将cell Nib的类设置为您的自定义类,注册它,它将为您使用可重用的单元格完成其余工作-从您的单元格中的任何初始值设定器中删除
loadViewFromNIB
方法,并在集合或表视图类上添加注册代码。

纯粹是FWIW。实际上,您应该只使用一个容器这几天的风景有点像“房间里的大象”使用iOS编程。现在一切都应该是一个容器视图。这非常简单。苹果这样做正是为了消除你提到的所有问题。长长的教程谁是你自定义视图的.nib的文件所有者?你是如何创建视图控制器的?它们是来自一个故事板还是另一个.nib?似乎你正在设置
ImageAndToolBarContainerView
视图的
类的
字段中,而不是在
文件的所有者中设置它。谢谢你,Joe,我会回顾一下。就文件所有权而言,nib的所有者是ImageAndToolBarContainerView类。视图控制器在情节提要中创建。ImageAndToolBarContainerView设置为文件所有者也是,而不是在视图的类中。您了解这一点了吗?我似乎遇到了类似的问题!