UIViewController的loadView方法未被调用

5

我希望能够通过编程的方式在NavigationController中设置一个UIViewController,但是loadView方法和viewDidLoad方法都没有被调用。

以下是我在AppDelegate中的代码:

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个回答

10

当调用 UIViewController 对象的 view getter方法时,如果其视图当前为 nil,则会创建其视图(通过从一个nib加载或实现 -loadView 方法)。

在示例代码中,您仅调用了 view 属性的 setter 方法而没有调用其 getter 方法。

此外,您正在从应用程序委托分配控制器的视图。期望 UIViewController 对象按需创建其自己的视图,而不是由其他类提供视图。这种方法将在稍后引起问题,因为当控制器卸载其视图并尝试响应内存警告以重新创建它时,您传递的视图将无效。让您的控制器创建其视图,不要尝试传递一个视图给它。


[viewController view] 调用视图的 getter,但您不需要直接这样做。您添加视图控制器的 UINavigationController 将在某个时候调用该 getter,以将您的控制器视图添加到视图层次结构中。您可以分享一下您的视图控制器实现吗?听起来好像还有其他问题。 - Jonah
基本上,这是来自Xcode的空UIViewController模板,但除了init方法之外,没有调用任何(view)方法。在那里,我尝试像这样设置视图:-(id)init {self((self = [super init])){UIView * view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.view = view; [view release]; } return self;} - L. Steiner
我试过使用-init作为最后的办法,因为loadView一开始就没有被调用。所以如果我再次删除init中的设置部分,-loadView-viewDidLoad也不会被调用。非常感谢你的帮助。@jonah - L. Steiner
好的,我注意到了一些事情。如果我不使用navigationController并将ViewControllers视图添加到窗口中,那么两种方法都会被调用。因此,在我的示例中,NavigationController似乎无法访问rootViewController的视图。 - L. Steiner
我的问题是我释放了NavController太早了,感谢你一直跟着我。 - L. Steiner
显示剩余2条评论

2
也许你没有遇到这个问题……但是前几天我遇到了同样令人恼火的麻烦……在我的UIViewController中,loadView、viewDidLoad和viewWillAppear都没有被调用。
我的问题很简单,但如果你不非常小心的话,就很难发现。我写的不是

,而是


-(void) loadView

I wrote:

-(void) loadview

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

2

还有一个需要注意的问题是,如果您定义了一个

@synthesize view;

如果你的实现中没有相匹配的@property,这可能导致对你的视图控制器的调用返回nil,并且不会调用你的loadView方法。


1
啊哈!这个问题困扰了我。由于一个过于热心的查找/替换操作,我在一个类中最终得到了一个"@synthesize view",但我没有意识到这一点,结果我的视图完全变空了,因为loadView再也没有被调用了。这个问题很难追踪。谢谢! - Joe Strout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接