72

我已经查看了我可以找到的所有教程,但我仍然没有答案。我需要从代码中调用另一个视图。我正在使用UIStoryboards. 我已经通过控制拖拽改变了很多次视图UIButtons,但现在它必须来自代码。如果这是用户第一次打开应用程序,我正在尝试从主菜单调用信息页面。但是,我似乎找不到从代码中更改视图的方法。我所有的视图都由相同的文件(ViewController2)控制。我的identifier主菜单是ViewControllerMainidentifier信息页面是ViewControllerInfo。首先我尝试了这个:

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

然后我尝试UIViewControllers为每个人做不同的事情并说:

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

都没有奏效。对于第一个,它说:

使用未声明的标识符 ViewControllerMain。

在第二个中,它说:

意外的接口名称“ViewController”:预期的标识符。

我能做些什么?

4

8 回答 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];

Identifier您的视图控制器的名称等于您的视图控制器的类名,或者您可以在情节提要的身份检查器中分配的情节提要 ID。

于 2013-04-21T18:29:50.527 回答
21

您需要从情节提要中实例化视图控制器,然后显示它:

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

此示例假定您有一个导航控制器以便返回到前一个视图。你当然也可以使用 presentViewController:animated:completion:。要点是让您的故事板使用目标视图控制器的 ID 实例化您的目标视图控制器。

于 2013-04-21T21:00:32.707 回答
20

迅速

这会从情节提要中获取一个视图控制器并呈现它。

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

根据需要更改情节提要名称、视图控制器名称和视图控制器 ID。

于 2016-06-10T04:44:34.113 回答
5

你可以用这种方式调用 ViewController,如果你想用 NavigationController

在此处输入图像描述

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

希望这对那里的人有用:)

于 2015-03-21T12:18:41.597 回答
3

有两种方法可以做到这一点:

1,如我在此处的回答中所述,在 Storyboard 中为您的 ViewController 创建一个转场:如何在 iOS 5 中执行与用户输入无关的转场?

2,给你的 ViewController 和标识符,并在这里使用我的答案中的代码调用它:Call storyboard scene programmatically (without need segue)?

于 2013-04-21T21:16:44.357 回答
1

这背后的主要逻辑是_,

NSString * storyboardIdentifier = @"SecondStoryBoard";

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

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

[self presentViewController:UIVC animated:YES completion:nil];
于 2016-06-13T13:40:49.797 回答
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];
于 2016-11-11T09:54:43.723 回答
0

导入要显示的视图控制器类并使用以下代码

KartViewController *viewKart = [[KartViewController alloc]initWithNibName:@"KartViewController" bundle:nil];
[self presentViewController:viewKart animated:YES completion:nil];
于 2015-08-24T07:40:11.653 回答