如何在视图控制器中通过编程方式切换视图?(Xcode,iPhone)

44

我已经苦苦挣扎了一段时间,似乎从来都无法得到直接的答案。

非常感谢任何帮助!

11个回答

87

如果你正在使用导航控制器:

ViewController *viewController = [[ViewController alloc] init];
[self.navigationController pushViewController:viewController animated:YES];

或者,如果你只想展示一个新视图:

ViewController *viewController = [[ViewController alloc] init];    
[self presentViewController:viewController animated:YES completion:nil];

4
请注意,UIViewController文档中已将presentModalViewController:animated:标注为已弃用。应改用presentViewController:animated:completion: - user577537
2
我正在思考这个问题,如果我使用第二种解决方案,我是否能够返回到上一个视图,如何实现? - user2533527
7
现在很少使用allocinit来实例化视图控制器,主要是因为使用了storyboards。你可以使用[self.storyboard instantiateViewControllerWithIdentifier@:"storyboard id"]来实例化视图控制器,或者如果使用segue的话,可以直接使用[self performSegueWithIdentifier:@"storyboard id" sender:self];进行转场并实例化新的视图控制器。如果使用NIBs,如果NIB的名称不同,则可以使用[[NSBundle mainBundle] loadNibNamed:@"nibname" owner:self options:nil]来实例化视图控制器。 - Rob
@Rob。代码行[self.storyboard instantiateViewControllerWithIdentifier@:"storyboard id"];执行多次,那么每次都会创建一个新的vc对象吗?之前的vc对象怎么办?这是内存泄漏吗? - Avijit Nagare
是的,每次它都会创建新的实例。早期的实例会一直存在,直到您将它们解除/弹出堆栈。 - Rob

33

如果您想在同一故事板中呈现新视图,

请在CurrentViewController.m文件中进行操作,

#import "YourViewController.h"

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
YourViewController *viewController = (YourViewController *)[storyboard instantiateViewControllerWithIdentifier:@"YourViewControllerIdentifier"];
[self presentViewController:viewController animated:YES completion:nil];

要为视图控制器设置标识符, 打开MainStoryBoard.storyboard。 选择YourViewController View-> Utilities -> ShowIdentityInspector。 在那里您可以指定标识符。


只要我按下DynamicTableView单元格中的一行,就会推送连续视图,例如: [链接]http://stackoverflow.com/questions/19329723/ipad-masterdetail-template - LAOMUSIC ARTS
好的,如果故事板被称为Main.Storyboard,你只需要放置@"Main",而不是@"Main.storyboard"。 - tong

18

Swift版本:

如果您正在导航控制器中:

let viewController: ViewController = self.storyboard?.instantiateViewControllerWithIdentifier("VC") as ViewController
self.navigationController?.pushViewController(viewController, animated: true)

或者,如果你只是想呈现一个新的观点:

let viewController: ViewController = self.storyboard?.instantiateViewControllerWithIdentifier("VC") as ViewController
self.presentViewController(viewController, animated: true, completion: nil)

17

instantiateViewControllerWithIdentifier 是指 Storyboard ID

NextViewController *NVC = [self.storyboard instantiateViewControllerWithIdentifier:@"NextViewController"];
[self presentViewController:NVC animated:YES completion:nil];

5
关闭由上一个代码中的CmdSft调用的Viewcontroller。
ViewController *viewController = [[ViewController alloc] init];    
[self presentViewController:viewController animated:YES completion:nil];

您可以使用

[self dismissViewControllerAnimated:YES completion: nil];

4

Swift 3.0 版本

如果你想呈现新的控制器。

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "controllerIdentifier") as! YourController
self.present(viewController, animated: true, completion: nil)

如果你想要跳转到导航控制器中的另一个控制器,请使用下面的代码:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "controllerIdentifier") as! YourController
self.navigationController?.pushViewController(viewController, animated: true)

标识符 = 故事板 ID。要设置标识符,请在故事板中选择视图控制器 > 身份检查器 > 标识符下的故事板 ID。 - Mark Gerrior

3
#import "YourViewController.h"

要推送一个包含导航栏和/或选项卡栏的视图,请执行以下操作:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"YourStoryboard" bundle:nil];
YourViewController *viewController = (YourViewcontroller *)[storyboard instantiateViewControllerWithIdentifier:@"YourViewControllerIdentifier"];
[self.navigationController pushViewController:viewController animated:YES];

要为视图控制器设置标识符,请打开 YourStoryboard.storyboard。选择 YourViewController 视图 -> 实用工具 -> 显示身份检查器。在那里,您可以指定标识符。


由于用户体验的变化,最后一句不适用于Xcode 10。 - Mark Gerrior

2
这对我起了作用:
NSTimer *switchTo = [NSTimer scheduledTimerWithTimeInterval:0.1
           target:selfselector:@selector(switchToTimer)userInfo:nil repeats:NO];

- (void) switchToTimer {
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil];
UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"MyViewControllerID"]; // Storyboard ID
[self presentViewController:vc animated:FALSE completion:nil];
}

1

Swift 3.0 中

从一个视图控制器到第二个视图控制器的跳转:

let loginVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "MsgViewController") as! MsgViewController
        self.navigationController?.pushViewController(loginVC, animated: true)

第二个视图控制器返回到第一个视图控制器: 通过“返回”按钮的操作事件:

self.navigationController?.popViewController(animated:true)

第三个视图控制器跳到第一个视图控制器。
self.navigationController?.popToRootViewController(animated:true)

在导航栏中,最重要的故事板未被点击,确保此返回操作执行。

1
[self.navigationController pushViewController:someViewController animated:YES];

1
这对我不起作用,我正在tableView:didSelectRowAtIndexPath:方法中进行是否重要? - mishajw126

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