在iOS中切换View Controller的最佳方式
我的项目中有2个视图控制器。 内部视图控制器1我想通过按一下button切换到视图控制器2。 目前我这样做
- (IBAction)startController2:(id)sender { viewController1 vc2 = [[viewController2 alloc] init]; self.view = vc2.view; }
这似乎工作正常,但button按下和第二个视图控制器之间出现一个很大的延迟(4秒)。 如果我直接从AppDelegate调用viewController2的东西加载速度更快。 我在这里做错了什么。 任何帮助是极大的赞赏。
几件事情要考虑。
第一部分:“我在这里做错了什么”?
-
你绝对不是故意做
self.view = vc2.view
。 您只需将一个视图控制器负责另一个视图控制器的视图。 你可能想说的是[self.view addSubview:vc2.view]
。 只有这个可以解决你的问题, 但 … -
不要实际使用该解决scheme。 尽pipe它几乎直接来自一些stream行的iPhone编程书籍的样本,但这是一个坏主意。 阅读“滥用UIViewControllers”了解原因。
第2部分:你应该做什么
这一切都在“展示来自其他视图控制器的视图控制器”一章中 。
它会下降到:
-
一个UINavigationController(见这里的优秀苹果指南),然后你简单地
[navigationController pushViewController:vc2]
-
这是一个“手动pipe理”的模式视图控制器堆栈,正如Andoabhay所言
-
如杰森所暗示的那样 ,明确地增加一个VC作为另一个孩子
你应该考虑使用UINavigationController
切换视图控制器。 如果你的构build目标是iOS 5.0+,你也可以使用新的控制器容器的概念: [mainViewController addChildViewController:childViewController]
。
使用presentModalViewController
如下
[self presentModalViewController:vc2 animated:YES completion:^(void){}];
并在viewController1
使用
[self dismissModalViewControllerAnimated:YES completion:^(void){}];
在哪里你想要回到以前的控制器。
[VCA presentViewController:VCB animated:NO completion:nil]; [VCB presentViewController:VCC animated:NO completion:nil];
当你想解散VCC,你可以这样做
[VCA dismissViewControllerAnimated:NO completion:nil];
这是stream程图。
VCA → VCB → VCC ↑___________↓
你应该使用UINavigationController切换视图控制器。
您在View1上,并在button单击方法上添加以下代码。
View2 *View2Controller = [[View2 alloc] initWithNibName:@"View2" bundle:nil]; [self.navigationController pushViewController:view2Controller animated:YES];