从nib实例化视图会引发错误

时间:2016-01-07 15:22:50

标签: ios swift uiview xib ibdesignable

我尝试在这个(link)教程之后创建@IBDesignable UIView子类。第一个自定义视图很好。但是当我尝试制作另一个时,我有错误。首先我得到failed to update auto layout status: the agent crashedFailed 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没问题。我使用相同的代码..

enter image description here

有什么想法吗?谢谢

4 个答案:

答案 0 :(得分:42)

您发布的loadViewFromNib()方法看起来很好,您正确地获取了包并将nib名称指定为字符串文字,因此它应该找到nib。正如其他人评论的那样,你的笔尖设置可能有问题。以下是一些要检查的事项:

  1. 您应该在Identity Inspector中将AdvancedCellView设置为文件的所有者自定义类。
  2. 检查模块是否正确 - 通常只是想让它空白。
  3. 不应设置View的自定义类,只需将其保留为默认值(UIView)。如果您的名称更具描述性,请参阅'查看'在侧边栏中,它可能是错误的。
  4. 检查笔尖中是否只有一个顶级对象。当您将View树折叠时,侧边栏应如下所示,没有任何其他条目。
  5. Nib hierarchy with only one top level view

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

答案 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)

我正在查看教程并发现如果您在自定义xib中继承View元素,那么您将收到错误。确保您只将“文件所有者”设置为自定义类。

enter image description here