【问题标题】:Initializing a View Controller初始化视图控制器
【发布时间】:2012-04-08 10:58:50
【问题描述】:

第一次实例化视图控制器时,它通常会创建或 加载它在其生命周期中需要的对象。它不应该创建 与显示内容相关的视图或对象。应该重点 关于实现其他关键的数据对象和对象 行为。

以上来自iOS参考:

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ViewLoadingandUnloading/ViewLoadingandUnloading.html#//apple_ref/doc/uid/TP40007457-CH10

文档继续描述了使用 Storyboard 的视图加载序列。

我的问题是:

1

由于视图控制器将与包含视图对象的 nib 文件相关联;而且它的“viewDidLoad”方法似乎是为在加载时配置视图对象而设计的。那么文档的建议应该如何:

“不应创建与显示内容相关的视图或对象”

被解释?

2

问题 1 是否与我们是否使用 Storyboard 相关?

【问题讨论】:

    标签: iphone ios


    【解决方案1】:

    不确定我的问题是否正确,但这是我的解释:

    1. initialization 和视图创建是两个独立的步骤。假设我有一个视图控制器,其表为IBOutlet,它应该显示存储在核心数据中的配方列表。在我的初始化方法中,我会从 CoreData 获取数据并将其存储在数组或获取的结果控制器中。我不需要表格,因此我对self.view 属性不做任何事情(如果还没有视图,则调用viewDidLoad)。在viewDidLoad 中,我调用[tableView reloadData] 来重绘单元格,以便它们显示来自我在控制器初始化程序中创建的控制器的数据。

    2. 我不认为它是相关的,但故事板应该只是你的视图控制器的脚手架,用单个文件替换单独的 nib。

    【讨论】:

    • 感谢@Eimantas 的回答。正如您所暗示的那样,文档可能意味着视图对象是在视图控制器加载之前在 nib 文件中创建的...
    • @Stanley 当视图控制器使用 nib 实例化时,nib 文件未归档到内存中。在那里,每个视图都会收到initWithCoder:awakeFromNib 调用。然后在连接所有出口和操作后,您会收到viewDidLoad 调用。
    • 感谢您的友好帮助和详细回复... :)
    【解决方案2】:

    您引用的陈述与移动设备的限制和设计效率有很大关系。它与 Storyboard 无关。

    通过“实例化”,文档意味着-(id)init; 调用。发生这种情况时,控制器“准备关键数据,但不创建视图”。这意味着控制器评估 xib 文件,并在初始化时构造视图的内部分层表示。此步骤仅涉及 RAM 和 CPU。

    视图控制器仅在将其推入导航控制器或视图转换动画时(即viewDidLoad 启动时)创建视图。这是因为视图很昂贵。它涉及 GPU 和视频 RAM。视频 RAM 比 RAM 更受限制,在不需要显示时仅创建视图(VRAM 中的后台缓冲区)效率不高。

    如果您查看您的项目,您应该会发现一些视图控制器正在初始化但不需要立即显示。如果没有这样的设计,VRAM 会无缘无故地快速耗尽。

    【讨论】:

    • 视图控制器不会查看它的 nib 或在 init 中评估它。它在 loadView 中执行此操作。数据到 GPU 的传输发生在视图添加到可见窗口时,这发生在 viewDidLoad 返回之后。
    • @robmayoff,感谢您的意见。所以视图控制器在init 期间并没有做太多事情。
    • 感谢 Shiming 和 rob,您的答案和 cmets 中的详细分析...
    猜你喜欢
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 2019-07-28
    相关资源
    最近更新 更多