从笔尖实例化视图会引发错误
我尝试在这个( 链接 )教程之后创build@IBDesignable UIView子类。 第一个自定义视图很好。 但是当我尝试做另一个,我有错误。 首先,我failed to update auto layout status: the agent crashed
, Failed 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。 正如其他人所评论的那样,您可能会在设置笔尖时出现错误。 这里有几件事情要检查:
- 您应该将
AdvancedCellView
设置为Identity Inspector中的文件所有者自定义类。 - 检查模块是否正确 – 通常你只是想把它留空。
- 视图的自定义类不应该被设置,只需将其保留为默认值(UIView)即可。 如果在侧栏中有一个比“查看”更具描述性的名称,则可能是错误的。
- 检查你在笔尖只有一个顶层对象。 侧栏应该看起来像这样,没有任何其他的条目,当你的视图树折叠。
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元素,那么你将会得到这个错误。 确保您只将“文件所有者”设置为您的自定义类。