initWithNibName和initWithCoder之间的区别

时间:2010-10-21 10:47:32

标签: iphone

任何人都可以向我解释一下何时使用initWithNibName以及何时使用initWithCoder?

3 个答案:

答案 0 :(得分:6)

initWithNibName:通常与视图控制器对象一起使用。这个想法是你有一个NIB文件(或XIB,同样的东西),它有一个你已经在Interface Builder中设计的UIView(或NSView)。当您的视图控制器启动时,它具有view属性和出口,您必须自己绘制 - 除了您已经在IB中设计它。因此,此构造函数允许您启动新的控制器对象,并告诉它在哪个NIB文件中查找其视图。讨论连接你的NIB本身以确保这是成功的有点超出了这里的主题。

initWithCoder:完全有另一项任务。当您使用encodeWithCoder:序列化对象时,最终需要反序列化(或“解码”)该数据以将其转换回类的对象。

无论如何,回顾一下:只有当您希望对象支持encodeWithCoder:协议时,才会在您的课程上实施initWithCoder:NSCoding。当您想要启动一个可以使用NIB文件中存档的对象初始化其属性的对象时,可以使用initWithNibName:(通常不自己实现)。

NSCoding over here有一个非常棒的视角。

答案 1 :(得分:2)

来自Apple的文档:

InitWithCoder对一个对象进行编码以进行存档。编码器通过调用encodeWithCoder:或initWithCoder来指示对象这样做。 encodeWithCoder:指示对象将其实例变量编码为提供的编码器...

InitWithNibName返回初始化为指定包中的nib文件的NSNib对象。加载nib文件后,NSNib对象使用bundle的资源映射来查找nib引用的其他资源。如果为bundle参数指定了nil,则NSNib对象会在与nib文件所有者的类关联的包中查找这些资源。如果nib文件没有所有者,则NSNib对象会在应用程序的主包中查找其他资源。

前者用于编码代码中的单个对象,后者用于检索包含资源对象的NSNib文件。

答案 2 :(得分:2)

故事板

您应该更喜欢-initWithCoder:-initWithNibName,因为从 Storyboard 加载视图时只会调用前者。