我想以编程方式在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
修改
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仍然没有被调用。
答案 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方法。