首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >描述initWithNibName,awakeFromNib和viewDidLoad?

描述initWithNibName,awakeFromNib和viewDidLoad?
EN

Stack Overflow用户
提问于 2009-08-06 16:23:49
回答 3查看 12.9K关注 0票数 19

对于initWithNibNameawakeFromNibviewDidLoad是否有一个很好的概述,其中列出了使用每种方法的最佳方法,并准确地描述了它们各自的功能?我觉得这些很令人困惑。在使用View生成的模板中,有关initWithNibName的注释如下:

指定的初始化器。重写以执行加载视图之前所需的设置。

但是,这个方法似乎从未被调用过(我正在使用IB来设置)。那么,我应该使用awakeFromNibviewDidLoad来进行初始化吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-08-06 16:38:23

如果要在IB中创建视图,则应该使用viewDidLoad。这将在每次将视图初始化为要设置时调用。当您在代码中创建视图时,可以使用initWithNibName:。您不应该将awakeFromNib与视图一起用于iPhone。

initWithNibName似乎没有被调用的原因是,接口构建器实际上创建了视图控制器的一个真实实例,然后序列化了该视图。因此,当您在IB中创建视图控制器(基本上将它添加到您的项目中)时,IB调用initWithNibName,但是除非您重写了默认的encodeWithCoder:,否则当从nib (反序列化)加载视图时,您设置的任何临时变量都将消失。这通常是可以的,因为您通常希望使用特定于应用程序当前运行上下文的信息来设置视图,而不是预先确定的初始化器。

但是,即使您是以编程方式创建视图和视图控制器,仍然可以将所有初始化放在viewDidLoad中。这通常更好,因为如果您的视图最终被缓存(卸载),然后返回到屏幕上,则可以再次调用viewDidLoad,而不一定要调用初始化程序。例如,以编程方式创建视图并将其推送到导航控制器的堆栈--稍后视图被掩盖,并发出内存警告,因此nav控制器“卸载”视图,但不释放对象--当视图返回时(其他视图弹出),nav控制器将再次调用viewDidLoad,以便重新初始化,但不会再次调用initWithNib。请注意,这是一种罕见的情况,然而,大多数人的应用程序在这一点上都会因为其他原因而死亡。

票数 24
EN

Stack Overflow用户

发布于 2010-08-24 18:31:42

我刚刚做了一些关于这个话题的研究,所以我想分享一些我学到的东西。

  1. awakeFromNib与iPhone的视图一起使用没有什么问题。见这份Apple Dev文档
  2. 当从NIB文件加载视图时,initWithCoder不是一个进行初始化的好地方,因为同一NIB文件中的其他项可能已经初始化,也可能没有初始化。例如,出口可能仍然是零。在调用awakeFromNib时,保证正确初始化同一个NIB文件中的所有项。
  3. viewDidLoad是在viewController中进行安装工作的好地方。

那么,为什么要在视图中使用awakeFromNib呢?我可以想到的一个原因是,如果在视图被初始化并连接到NIB文件中的其他对象之后,您想要做一些事情,但是您只想将它封装在视图中。这减少了与视图控制器的链接。

票数 35
EN

Stack Overflow用户

发布于 2014-08-13 16:17:53

viewDidLoad可以被多次调用,所以它不是大多数初始化的合适位置(尽管实际上它只被调用一次,除非您进行干预)--这就是为什么awakeFromNib是特殊和非常必要的:它只被调用一次。

viewDidLoad在UIView上不存在-- UIView有用于初始化的awakeFromNib,也没有其他合理的选项。

在过去的六个月里,我一直愉快地使用awakeFromNib和故事板(一个应用程序的一个故事板),一点也不麻烦,而且它完全符合文档中指定的所有插座的配置。然后,今天我拆开了一些代码,放入了一个新的视图控制器和视图,其中没有一个像我过去所经历的那样工作,即awakeFromNib中的所有插座都是零。我的理论很简单-- SDK很糟糕,因为它很容易在控制器/视图和类链中做一些琐碎的事情,并打破一切。

现在我又开始研究这个毫无意义的话题,而我所需要的只是一个简单一致的地方来进行初始化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1240010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档