任何人都可以向我解释一下何时使用initWithNibName以及何时使用initWithCoder?
答案 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 加载视图时只会调用前者。