我的项目中有2个视图控制器。 Inside View Controller1我想通过按下按钮切换到View Controller 2。目前我这样做
- (IBAction)startController2:(id)sender {
viewController1 vc2 = [[viewController2 alloc] init];
self.view = vc2.view;
}
这似乎工作正常,但按钮按下和第二个视图控制器之间出现了很大的延迟(4秒)。如果我直接从AppDelegate调用viewController2加载更快的东西。我在这做错了什么。非常感谢任何帮助。
答案 0 :(得分:39)
需要考虑几件事。
你绝对不想做self.view = vc2.view
。您只需将一个视图控制器负责另一个视图控制器的视图。你可能想说的是[self.view addSubview:vc2.view]
。仅此一项就可以解决您的问题,但 ...
实际上不要使用该解决方案。即使它几乎直接来自some popular iPhone programming books中的样本,但这是一个坏主意。阅读"Abusing UIViewControllers"以了解原因。
这一切都在章节"Presenting View Controllers from Other View Controllers"中。
它将归结为:
一个UINavigationController,(参见优秀的Apple指南here)然后你只需[navigationController pushViewController:vc2]
“手动管理”的模态视图控制器堆栈,如andoabhay suggests
明确地将VC作为另一个VC的子项添加为jason suggests
答案 1 :(得分:4)
您应该考虑使用UINavigationController
来切换视图控制器。如果您的构建目标是iOS 5.0+,您还可以使用新的控制器容器概念:[mainViewController addChildViewController:childViewController]
。
答案 2 :(得分:2)
使用presentModalViewController
如下
[self presentModalViewController:vc2 animated:YES completion:^(void){}];
并在viewController1
使用
[self dismissModalViewControllerAnimated:YES completion:^(void){}];
你想要回到以前的控制器。
答案 3 :(得分:0)
[aController presentViewController:bController animated:NO completion:nil];
[bController presentViewController:cController animated:NO completion:nil];
当你想要解雇cController时,你可以这样做
[aController dismissViewControllerAnimated:NO completion:nil];
这是流程图。
aController → bController → cController
↑___________________________↓