在 iOS 中切换视图控制器的最佳方法

Posted

技术标签:

【中文标题】在 iOS 中切换视图控制器的最佳方法【英文标题】:Best way to switch View Controller in iOS 【发布时间】:2012-04-22 05:05:06 【问题描述】:

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

- (IBAction)startController2:(id)sender 

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

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

【问题讨论】:

像这样在视图控制器之间移动视图控制器视图绝对是错误的。 (每个视图控制器“拥有”它的视图。) 你应该使用导航控制器推送到另一个视图控制器 【参考方案1】:

需要考虑的几件事。

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

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

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

第 2 部分:你应该做什么

这一切都在章节"Presenting View Controllers from Other View Controllers" 中。

它会归结为:

一个 UINavigationController,(请参阅优秀的 Apple 指南 here)然后您只需 [navigationController pushViewController:vc2]

模态视图控制器的“手动管理”堆栈,如andoabhay suggests

显式添加一个 VC 作为另一个子级,如 jason suggests

【讨论】:

【参考方案2】:

您应该考虑使用UINavigationController 来切换视图控制器。如果您的构建目标是 ios 5.0+,您还可以使用新的控制器容器概念:[mainViewController addChildViewController:childViewController]

【讨论】:

【参考方案3】:

如下使用presentModalViewController

[self presentModalViewController:vc2 animated:YES completion:^(void)];

并在viewController1 中使用

[self dismissModalViewControllerAnimated:YES completion:^(void)];

您想回到上一个控制器的地方。

【讨论】:

此方法现已弃用 dismissViewControllerAnimated:completion: 是使用这个范例的新方法【参考方案4】:
[aController presentViewController:bController animated:NO completion:nil];
[bController presentViewController:cController animated:NO completion:nil];

当你想关闭 cController 时,你可以这样做

[aController dismissViewControllerAnimated:NO completion:nil];

这是流程图。

aController → bController → cController
    ↑___________________________↓

【讨论】:

【参考方案5】:

您应该使用 UINavigationController 来切换视图控制器。

您在 View1 上并在按钮单击方法上添加以下代码。

View2 *View2Controller = [[View2 alloc] initWithNibName:@"View2" bundle:nil]; [self.navigationController pushViewController:view2Controller animated:YES];

【讨论】:

以上是关于在 iOS 中切换视图控制器的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

切换iPhone视图的最佳做法?

在 UISplitViewController 和其他视图控制器之间切换的最佳方式?

在 iOS 7 中的两个简单视图控制器之间进行切换的正确方法

切换视图时标签栏丢失

1 个屏幕的最佳方法包含 2 个视图控制器

Swift iOS 应用程序最佳方法 - 带输入的预订