如何通过编程方式调用视图控制器?

72

我已经查看了所有能找到的教程,但仍然无法得到答案。我需要从代码中调用另一个视图。我正在使用 UIStoryboards。我曾经通过控制拖动 UIButtons 来多次更改视图,但现在必须通过代码来实现。我正在尝试在用户第一次打开应用程序时从主菜单调用信息页面。然而,我似乎找不到从代码中更改视图的方法。所有的视图都由同一文件(ViewController2)控制。我的主菜单的 identifierViewControllerMain,信息页面的 identifierViewControllerInfo。首先我尝试了以下代码:

[ViewControllerMain presentViewController: ViewControllerInfo 
                                 animated:YES 
                               completion: NULL];

接着我尝试为每一个制作不同的UIViewController并说:

[ViewController2 presentViewController: ViewController 
                              animated:YES 
                            completion: NULL];

两个都没有起作用。第一个说:

使用未声明的标识符ViewControllerMain。

在第二个中,它说:

意外的接口名称 'ViewController':期望标识符。

我该怎么办?


你如何创建控制器? - Avi Tsadok
我在MainStoryboard.storyboard文件中创建了它们。 - Samuel Noyes
8个回答

137

创建视图控制器:

UIViewController * vc = [[UIViewController alloc] init];

调用一个视图控制器(必须从另一个视图控制器中调用):

[self presentViewController:vc animated:YES completion:nil];

首先,使用nil而不是null。


从故事板中加载视图控制器:

NSString * storyboardName = @"MainStoryboard"; 
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil];
UIViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"IDENTIFIER_OF_YOUR_VIEWCONTROLLER"];
[self presentViewController:vc animated:YES completion:nil];

您的视图控制器的标识符可以是视图控制器的类名,也可以是您在Storyboard的身份检查器中分配的Storyboard ID。


2
你好 @190290000 Ruble Man。这样做是可以的,但我想展示一个已经从storyboard文件中创建好的视图。现在展示的只是一个空白的视图。有没有什么办法可以做到这一点呢?我正在尽力而为,肯定还有很多需要学习的地方。 - Samuel Noyes
如果执行多次以下代码行:UIViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"IDENTIFIER_OF_YOUR_VIEWCONTROLLER"]; 那么每次都会创建一个新的vc对象吗?那之前的vc对象怎么办?这会导致内存泄漏吗? - Avijit Nagare
@AvijitNagare 哥们,多亏了 ARC(假设你正在使用它),引用将自动释放,所以你不必担心它。如果你想创建多个具有相同名称的变量,那么这将导致编译器错误,因此它甚至不会让你这样做。 - Samuel Noyes
好的。意味着每次创建新的变量,如:UIViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"IDENTIFIER_OF_YOUR_VIEWCONTROLLER"]; 但 ARC 管理其内存。 - Avijit Nagare

21
你需要从Storyboard中实例化视图控制器,然后展示它:

你需要从故事板中实例化视图控制器,然后显示它:

ViewControllerInfo* infoController = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewControllerInfo"];
[self.navigationController pushViewController:infoController animated:YES];

这个例子假设你有一个导航控制器,以便返回到上一个视图。当然,你也可以使用presentViewController:animated:completion:。主要的重点是让你的故事板使用目标视图控制器的ID来实例化你的目标视图控制器。


20

Swift

这会从 storyboard 中获取一个视图控制器并将其呈现。

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let secondViewController = storyboard.instantiateViewController(withIdentifier: "secondViewControllerId") as! SecondViewController
self.present(secondViewController, animated: true, completion: nil)

根据需要更改故事板名称、视图控制器名称和视图控制器 ID。


如果我的Storyboard中没有任何视图控制器,而我正在创建一个编程类,那么我该如何通过编程方式创建一个视图控制器并为其分配一个类,并呈现它? - iOS Developer
@iOS开发者,我不知道。 - Suragch

5
你可以这样调用ViewController,如果需要使用NavigationController:

你可以这样调用ViewController,如果需要使用NavigationController:

enter image description here

1.在当前屏幕:加载新屏幕

VerifyExpViewController *addProjectViewController = [[VerifyExpViewController alloc] init];
[self.navigationController pushViewController:addProjectViewController animated:YES];

2.1 加载视图中:在.h文件中添加以下内容

@interface VerifyExpViewController : UIViewController <UINavigationControllerDelegate>

2.2 在加载的视图中:在 .m 文件中添加以下内容

  @implementation VerifyExpViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.navigationController.delegate = self;
    [self setNavigationBar];
}
-(void)setNavigationBar
{
    self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
    self.navigationController.navigationBar.translucent = YES;
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"B_topbar.png"] forBarMetrics:UIBarMetricsDefault];
    self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor whiteColor]};
    self.navigationItem.hidesBackButton = YES;
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Btn_topback.png"] style:UIBarButtonItemStylePlain target:self action:@selector(onBackButtonTap:)];
    self.navigationItem.leftBarButtonItem.tintColor = [UIColor lightGrayColor];
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Save.png"] style:UIBarButtonItemStylePlain target:self action:@selector(onSaveButtonTap:)];
    self.navigationItem.rightBarButtonItem.tintColor = [UIColor lightGrayColor];
}

-(void)onBackButtonTap:(id)sender
{
    [self.navigationController popViewControllerAnimated:YES];
}
-(IBAction)onSaveButtonTap:(id)sender
{
    //todo for save button
}

@end

希望这对某些人有所帮助 :)

3

1
这句话的主要逻辑是_。
NSString * storyboardIdentifier = @"SecondStoryBoard";

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardIdentifier bundle: nil];

UIViewController * UIVC = [storyboard instantiateViewControllerWithIdentifier:@"YourviewControllerIdentifer"];

[self presentViewController:UIVC animated:YES completion:nil];

如果我的Storyboard中没有任何视图控制器,而我正在创建一个编程类,那么我该如何通过编程方式创建一个视图控制器并为其分配一个类,并呈现它? - iOS Developer

1
        UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone_iOS7" bundle:nil];
            AccountViewController * controller = [storyboard instantiateViewControllerWithIdentifier:@"accountView"];
            //            [self presentViewController:controller animated:YES completion:nil];

        UIViewController *topRootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
        while (topRootViewController.presentedViewController)
        {
            topRootViewController = topRootViewController.presentedViewController;
        }

        [topRootViewController presentViewController:controller animated:YES completion:nil];

3
这个问题已经有3年历史并且有一个被接受的答案,如果您有有价值的贡献,请解释一下而不是只发布代码。 - pancho018

0
导入你想要展示的视图控制器类,并使用以下代码。
KartViewController *viewKart = [[KartViewController alloc]initWithNibName:@"KartViewController" bundle:nil];
[self presentViewController:viewKart animated:YES completion:nil];

如果我的Storyboard中没有任何视图控制器,而我正在创建一个编程类,那么我该如何通过编程方式创建一个视图控制器并为其分配一个类,并呈现它? - iOS Developer
以上代码不需要任何故事板,它可以使用xib正常工作。 - vijeesh
如果我既没有故事板也没有XIB,该怎么办? - iOS Developer
初始化它时不要使用nib名称,然后尝试。 - vijeesh

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