在initWithNibName之后调用ViewDidLoad

时间:2010-04-19 22:21:38

标签: iphone cocoa-touch

ViewDidLoad()只有在物理显示View(即通过NavigationController pushViewController)后才会发送到ViewController,而不是在initWithNibName()之后立即发送。这是我可以依赖的行为吗?我希望有机会设置我的视图的成员变量,以便在调用ViewDidLoad()时所有成员都有效。

4 个答案:

答案 0 :(得分:7)

您可以在initWithNibName:bundle:中设置成员变量和其他类似内容。

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle {
    if (self = [super initWithNibName:nibName bundle:nibBundle]) {
        // set up ivars and other stuff here.
        someIvar = someValue;
    }
    return self;
}

你是正确的,viewDidLoad:仅在物理显示视图时发送,即当它被添加到某个可见视图时(如果用户没有到达该视图,有时可能永远不会)。因此,分割功能并考虑在初始时可以执行的操作以及在视图加载时发生的情况非常有用。

正如Marcelo Cantos在评论中指出的那样,viewDidLoad:通常是使用“延迟加载”概念进行各种设置工作的好地方,因此您可以将设置推迟到尽可能晚的时间。

答案 1 :(得分:3)

在第一次显示视图控制器之前调用

viewDidLoad,而不是在initWithNibName之后立即调用。例如,如果您有一个标签栏控制器,则所有子视图控制器在启动时都为init d,但只有在您第一次单击相应的选项卡时才会调用viewDidLoad。在viewDidLoad初始化内存密集型项目通常是个好主意,以避免使用不必要的内存。

答案 2 :(得分:1)

我发现如果我在视图控制器中覆盖initiWithNibName,则不会调用viewDidLoad方法。我必须手动调用它[self viewDidLoad]。但是如果我不覆盖initWithNibName:调用viewDidLoad。我正在使用标签栏控制器中的4个视图控制器。标签栏控制器从另一个视图加载。

答案 3 :(得分:1)

很抱歉找到一个旧线程,但这解决了我...

- (void)viewDidLoad仅在 - (void)loadView完成其事后调用。在loadView的文档中:

  

视图控制器在请求其view属性但当前为nil时调用此方法。

我的视图控制器只有在视图被UITabBarItem请求后才调用viewDidLoad,这意味着只有在按下标签栏按钮后才能在viewController中调用viewDidLoad。我和OP一样,希望在加载nib后直接调用viewDidLoad,因此可以在用户单击选项卡按钮之前填充其内容(标题等)。

所以,在调用“self = [super initWithNibName:@”nibName“bundle:nil];”之后在视图控制器的自定义初始化程序中,我之后立即调用了“[自我视图]”。由于视图是在UITabBarItem(调用'addSubview')请求之前请求的,因此视图在初始化期间完全初始化,而不是在请求时初始化。

希望这会有所帮助。