UIviewcontroller - 啥时候实例化视图属性?

Posted

技术标签:

【中文标题】UIviewcontroller - 啥时候实例化视图属性?【英文标题】:UIviewcontroller - what time is the view property instantiated?UIviewcontroller - 什么时候实例化视图属性? 【发布时间】:2014-11-03 13:13:18 【问题描述】:

我想知道 UIViewController 的 .view 属性究竟是什么时候创建的。

我创建了一个 ViewController,并在 init(coder: aDecoder) 中开始设置一些变量。当我尝试设置 viewController.view.backgroundColor 它崩溃了。 我在 viewDidLoad 中放置了相同的代码行,它工作了。

这是我的代码

class WebViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()
        println("didload")
        self.view.backgroundColor = UIColor.redColor()
    


    required init(coder aDecoder: NSCoder) 
        println("init Coder")
        super.init(coder: aDecoder)
        self.tabBarItem.title = nil
        //self.view.backgroundColor = UIColor.redColor() // CAUSE CRASH
    

这是错误:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/Mari/Library/Developer/CoreSimulator/Devices/A9CC10D9-409E-4604-A6F7-B3729E0B3D52/data/Containers/Bundle/Application/F5DFDFE6-87B9-40AF-A26B-7B5A1506D203/test.app> (loaded)' with name '9pv-A4-QxB-view-tsR-hK-woN''

在初始化编码期间,VC 被实例化,可以设置标签栏,因为它来自根视图控制器(标签栏控制器),但视图是 VC 的属性,所以在初始化期间,仍然不是准备好设置。我对吗?

所以... view 属性何时被精确实例化? 设置它的最佳时机是什么时候?

【问题讨论】:

viewDidLoad,顾名思义,是在视图加载到内存后立即调用的,因此这是对视图进行额外设置的最佳位置。 【参考方案1】:

视图在 initializer(在您的情况下为 init(coder aDecoder: NSCoder))和 viewDidLoad 之间实例化。

在此期间,ios 会从您的 IB 文件加载 UI 组件。作为开发人员,您可以在 viewDidLoad 中自定义视图(例如通过更改颜色)。

您可以在documentation 中了解有关视图控制器生命周期的更多信息。

【讨论】:

以上是关于UIviewcontroller - 啥时候实例化视图属性?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript 中数组与对象的实例化。数组啥时候是对象,啥时候得到数组的方法?

c++啥时候实例化方法?

UIViewController 扩展从情节提要中实例化

无需 nib 以编程方式实例化 UIViewController

在 AppDelegate 中实例化初始 UIViewController

Swift - 从 Nib 实例化总是返回 UIViewController 类型而不是动态类型