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

14

我的项目中有两个视图控制器。在第一个视图控制器内,我想通过按一个按钮来切换到第二个视图控制器。目前我是这样做的

- (IBAction)startController2:(id)sender {

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

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


在视图控制器之间移动视图控制器的视图肯定是错误的。(每个视图控制器“拥有”它自己的视图。) - nielsbot
1
你应该使用导航控制器来推到另一个视图控制器。 - Amitabha
5个回答

40

有几个需要考虑的事情。

第一部分:「我这里做错了什么」?

  1. 你绝对不是想要执行 self.view = vc2.view。你只是让一个视图控制器负责另一个视图控制器的视图。你可能想要使用的是 [self.view addSubview:vc2.view]。这样可能可以解决你的问题,但是...

  2. 实际上不要使用那个解决方法。即使它几乎直接来自一些流行的iPhone编程书籍中的示例,这也是一个坏主意。阅读"滥用UIViewControllers"以理解原因。

第二部分:你应该做什么

这全部都在章节"从其他视图控制器呈现视图控制器"中。

这将归结为以下两种方式之一:

  • 使用UINavigationController(请参见Apple的优秀指南here),然后您只需[navigationController pushViewController:vc2]

  • 使用“手动管理”的模态视图控制器堆栈,如andoabhay建议

  • 显式地将一个VC添加为另一个VC的子视图控制器,如jason建议所述


4

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


2

使用presentModalViewController方法如下:

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

viewController1中使用

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

无论你想回到哪个控制器,都可以返回先前的控制器。


1
这种方法现在已经过时了。 - Ravindranath Akila
1
dismissViewControllerAnimated:completion: 是使用此范例的新方法。 - dotToString

0
[aController presentViewController:bController animated:NO completion:nil];
[bController presentViewController:cController animated:NO completion:nil];

当您想要关闭cController时,可以像这样操作

[aController dismissViewControllerAnimated:NO completion:nil];

这是流程图。

aController → bController → cController
    ↑___________________________↓

-1

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

如果你在View1上,可以在按钮点击方法中添加以下代码:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接