25

我试图按照这个(链接)教程制作@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 是没有问题的。我使用相同的代码..

在此处输入图像描述

有任何想法吗?谢谢

4

4 回答 4

51

您发布的loadViewFromNib()方法看起来不错,您正确获取包并将笔尖名称指定为字符串文字,因此它应该找到笔尖。正如其他人评论的那样,您的笔尖设置可能有问题。这里有几件事要检查:

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

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

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

于 2016-02-29T14:50:15.510 回答
11

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

在此处输入图像描述

于 2017-05-18T16:23:26.383 回答
2

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

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

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

于 2016-01-10T18:46:30.743 回答
1

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

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

return view

让我知道这是否有效

于 2016-01-07T16:28:21.877 回答