未调用UIViewController的loadView

时间:2011-09-11 19:42:18

标签: iphone ios uiview uiviewcontroller

我想以编程方式在NavigationController中设置UIViewController,但是会调用loadView和viewDidLoad方法。

这是我在app delegate中的代码:

MyViewController *viewController = [[MyViewController alloc] init];
UIView *view = [[UIView alloc] initWithFrame:window.frame];
viewController.view = view;

UINavgationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];

[window addSubview:[navController view];
[window makeKeyAndVisible];

当我启动应用程序时,我看到一个导航栏,但没有调用loadView。我错过了什么? 我认为在调用view

后调用loadView

修改

MyViewController *viewController = [[MyViewController alloc] init];
[viewController view];  // doesn't look right?

UINavgationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];

[window addSubview:[navController view];
[window makeKeyAndVisible];

编辑了Jonah的评论,但是loadView仍然没有被调用。

3 个答案:

答案 0 :(得分:10)

当调用控制器的UIViewController getter并且其视图当前为-loadView时,view将创建其视图(通过从nib加载或实现nil)。

在显示的代码中,您永远不会调用view属性的getter,只调用它的setter。

此外,您正在从应用代表分配控制器的视图。 UIViewController预计会根据需求创建自己的视图,而不是由其他类提供。当您意识到控制器卸载其视图并尝试重新创建它以响应内存警告时,此方法将在以后引发问题。让你的控制器创建它的视图,不要试图传递它。

答案 1 :(得分:2)

也许你没有遇到这个问题......但是前几天我遇到了同样的烦恼..在我的UIViewController中没有调用loadView,viewDidLoad和viewWillAppear。

我的问题是简单但有点棘手,如果你不是很小心的话。而不是写

-(void) loadView

我写道:

-(void) loadview

请注意,这不会触发任何警告。 loadView中“V”和“v”的差异很容易被忽略。显然,由于loadView没有被调用,viewDidLoad / viewWillAppear也不会被调用,因为没有加载的视图(我没有使用任何nib ...以编程方式创建视图)。

-Anshu

答案 2 :(得分:2)

另一个值得注意的问题是,如果你定义一个

@synthesize view;

在您的实现中没有匹配的@property,这可能导致调用视图控制器返回nil,而不调用loadView方法。