从笔尖实例化视图会引发错误

我尝试在这个( 链接 )教程之后创build@IBDesignable UIView子类。 第一个自定义视图很好。 但是当我尝试做另一个,我有错误。 首先,我failed to update auto layout status: the agent crashedFailed to render instance of ... 。 不知何故,我开始能够biuld和运行这些错误的项目,但后来我得到新的错误 – EXC_BAD_ACCESS ...在线let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView 。 这里是整个方法:

 func loadViewFromNib() -> UIView { let bundle = NSBundle(forClass: self.dynamicType) let nib = UINib(nibName: "advancedCellView", bundle: bundle) let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView return view } 

用第一个自定义UIView是没有问题的。 我使用相同的代码

在这里输入图像说明

有任何想法吗? 谢谢

你发布的loadViewFromNib()方法看起来很好,你正确地获得了bundle,并且指定了nib名字作为string,所以它应该findnib。 正如其他人所评论的那样,您可能会在设置笔尖时出现错误。 这里有几件事情要检查:

  1. 您应该将AdvancedCellView设置为Identity Inspector中的文件所有者自定义类。
  2. 检查模块是否正确 – 通常你只是想把它留空。
  3. 视图的自定义类不应该被设置,只需将其保留为默认值(UIView)即可。 如果在侧栏中有一个比“查看”更具描述性的名称,则可能是错误的。
  4. 检查你在笔尖只有一个顶层对象。 侧栏应该看起来像这样,没有任何其他的条目,当你的视图树折叠。

只有一个顶级视图的Nib层次结构

NB这个答案与OP链接的教程有关,而不是唯一正确的方法来设置一个笔尖。

instantiateWithOwner(options:)方法返回一个数组,而不是一个视图,所以强迫downcast到UIView将永远不会工作。 而是尝试转换为实际types[AnyObject]

数组中的元素对应于nib文件中的顶级对象,所以您感兴趣的视图应该是数组元素之一。 考虑到你的nib文件的名字,很有可能在数组中只有一个顶级对象 – 你要加载的单元格。 确保nib文件中只有一个顶级对象,并且确实是UIView子类的一个实例。

请注意,您的实施可能效率低下。 如果加载多个单元格,则应cachingUINib实例,而不是每次都创build一个新实例。 请注意,像UITableViewController这样的框架类已经内置了用于注册自动处理这些细节的nib的方法,所以您可能不需要自己去做。

尝试这样做,而不是。 总是为我工作:

 let picker = NSBundle.mainBundle().loadNibNamed("advancedCellView", owner: nil, options: nil) let view = picker[0] as! UIView return view 

让我知道这是否有效

我在看教程,发现如果你在自定义xib中inheritanceView元素,那么你将会得到这个错误。 确保您只将“文件所有者”设置为您的自定义类。

在这里输入图像说明