从 nib 实例化视图抛出错误

Instantiate view from nib throws error

我尝试按照此 (link) 教程创建 @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。这是整个方法:

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 是没有问题的。我使用相同的代码..

有什么想法吗?谢谢

尝试这样做。总是适合我:

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

return view

如果可行请告诉我

instantiateWithOwner(options:) 方法 returns 一个数组,而不是一个视图,因此强制向下转换为 UIView 将永远不会起作用。相反,尝试转换为实际类型 [AnyObject].

数组中的元素对应nib文件中的top-level个对象,所以你感兴趣的视图应该是数组元素之一。鉴于您的 nib 文件的名称,数组中很可能只有一个 top-level 对象——您要加载的单元格。确保 nib 文件中只有一个 top-level 对象,并且它确实是 UIView.

的子类的实例

请注意,您的实施可能效率低下。如果要加载多个单元格,则应缓存 UINib 实例而不是每次都创建一个新实例。请注意,框架 类(例如 UITableViewController)内置了用于注册 nib 的方法,这些方法会自动处理这些细节,因此您实际上可能不需要自己执行此操作。

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

  1. 您应该在 Identity Inspector 中将 AdvancedCellView 设置为文件所有者自定义 Class。
  2. 检查模块是否也正确 - 通常您只希望它为空。
  3. View 的 Custom Class 不应该设置,只需将其保留为默认值 (UIView)。如果侧边栏中的名称比 'View' 更具描述性,则可能是错误的。
  4. 检查笔尖中是否只有一个顶级对象。当您折叠视图树时,边栏应如下所示,没有任何其他条目。

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

我在查看教程时发现,如果您在自定义 xib 中子class View 元素,则会出现错误。确保您只将 "File's Owner" 设置为您的自定义 class.