我尝试在这个(link)教程之后创建@IBDesignable UIView子类。第一个自定义视图很好。但是当我尝试制作另一个时,我有错误。首先我得到failed to update auto layout status: the agent crashed
和Failed to render instance of ...
。不知何故,我开始能够使用这些错误生成并运行项目,但后来我在行EXC_BAD_ACCESS ...
上收到了新的错误 - 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没问题。我使用相同的代码..
有什么想法吗?谢谢
答案 0 :(得分:42)
您发布的loadViewFromNib()
方法看起来很好,您正确地获取了包并将nib名称指定为字符串文字,因此它应该找到nib。正如其他人评论的那样,你的笔尖设置可能有问题。以下是一些要检查的事项:
答案 1 :(得分:2)
instantiateWithOwner(options:)
方法返回一个数组,而不是一个视图,因此强制转发到UIView
永远不会有效。相反,请尝试转换为实际类型[AnyObject]
。
数组中的元素对应于nib文件中的顶级对象,因此您感兴趣的视图应该是数组元素之一。给定nib文件的名称,很可能在数组中只有一个顶级对象 - 您尝试加载的单元格。确保nib文件中只有一个顶级对象,并且它确实是UIView
的子类的实例。
请注意,您的实施效率可能会很低。如果您要加载多个单元格,则应缓存UINib
实例,而不是每次都创建一个新实例。请注意,诸如UITableViewController
之类的框架类已经内置了用于注册nib的方法,这些方法会自动处理这些细节,因此您实际上可能不需要自己执行此操作。
答案 2 :(得分:1)
尝试这样做。总是对我有用:
let picker = NSBundle.mainBundle().loadNibNamed("advancedCellView", owner: nil, options: nil)
let view = picker[0] as! UIView
return view
如果有效,请告诉我
答案 3 :(得分:1)