从 nib 实例化视图抛出错误
Instantiate view from nib throws error
我尝试按照此 (link) 教程创建 @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
。这是整个方法:
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。正如其他人评论的那样,您的笔尖设置可能有问题。以下是一些需要检查的事项:
- 您应该在 Identity Inspector 中将
AdvancedCellView
设置为文件所有者自定义 Class。
- 检查模块是否也正确 - 通常您只希望它为空。
- View 的 Custom Class 不应该设置,只需将其保留为默认值 (UIView)。如果侧边栏中的名称比 'View' 更具描述性,则可能是错误的。
- 检查笔尖中是否只有一个顶级对象。当您折叠视图树时,边栏应如下所示,没有任何其他条目。
N.B。这个答案与 OP 链接到的教程有关,而不是设置笔尖的唯一正确方法。
我在查看教程时发现,如果您在自定义 xib 中子class View 元素,则会出现错误。确保您只将 "File's Owner" 设置为您的自定义 class.
我尝试按照此 (link) 教程创建 @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
。这是整个方法:
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。正如其他人评论的那样,您的笔尖设置可能有问题。以下是一些需要检查的事项:
- 您应该在 Identity Inspector 中将
AdvancedCellView
设置为文件所有者自定义 Class。 - 检查模块是否也正确 - 通常您只希望它为空。
- View 的 Custom Class 不应该设置,只需将其保留为默认值 (UIView)。如果侧边栏中的名称比 'View' 更具描述性,则可能是错误的。
- 检查笔尖中是否只有一个顶级对象。当您折叠视图树时,边栏应如下所示,没有任何其他条目。
N.B。这个答案与 OP 链接到的教程有关,而不是设置笔尖的唯一正确方法。
我在查看教程时发现,如果您在自定义 xib 中子class View 元素,则会出现错误。确保您只将 "File's Owner" 设置为您的自定义 class.