在iOS中切换View Controller的最佳方式

我的项目中有2个视图控制器。 内部视图控制器1我想通过按一下button切换到视图控制器2。 目前我这样做

- (IBAction)startController2:(id)sender { viewController1 vc2 = [[viewController2 alloc] init]; self.view = vc2.view; } 

这似乎工作正常,但button按下和第二个视图控制器之间出现一个很大的延迟(4秒)。 如果我直接从AppDelegate调用viewController2的东西加载速度更快。 我在这里做错了什么。 任何帮助是极大的赞赏。

几件事情要考虑。

第一部分:“我在这里做错了什么”?

  1. 你绝对不是故意做self.view = vc2.view 。 您只需将一个视图控制器负责另一个视图控制器的视图。 你可能想说的是[self.view addSubview:vc2.view] 。 只有这个可以解决你的问题,

  2. 不要实际使用该解决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];