在 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 中切换视图控制器的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
在 UISplitViewController 和其他视图控制器之间切换的最佳方式?