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

时间:2012-04-22 05:05:07

标签: iphone objective-c ios ipad

我的项目中有2个视图控制器。 Inside View Controller1我想通过按下按钮切换到View Controller 2。目前我这样做

- (IBAction)startController2:(id)sender {

viewController1 vc2 = [[viewController2 alloc] init];
self.view = vc2.view;
}

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

4 个答案:

答案 0 :(得分:39)

需要考虑几件事。

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

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

  2. 实际上不要使用该解决方案。即使它几乎直接来自some popular iPhone programming books中的样本,但这是一个坏主意。阅读"Abusing UIViewControllers"以了解原因。

  3. 第2部分:你应该做什么

    这一切都在章节"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
    ↑___________________________↓