如何以编程方式调用View Controller?


70

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

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

然后,我尝试使UIViewControllers每种方法有所不同并说:

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

两者都不起作用。对于第一个,它说:

使用未声明的标识符ViewControllerMain。

在第二个中,它说:

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

我能做什么?


如何创建控制器?
阿维·扎多克

我在MainStoryboard.storyboard文件中创建了这些文件
Samuel Noyes

Answers:


136

创建视图控制器:

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。


2
嗨@ 190290000卢布人。这可行,但我想显示一个从情节提要文件中已经创建的视图。这只是给我一个空白的观点。有没有办法做到这一点?我正竭尽全力。我肯定有很多东西要学。
Samuel Noyes

@JohnFarkerson:没问题!
190290000卢布人

说,如果行代码UIViewController * vc = [storyboard InstantiateViewControllerWithIdentifier:@“ IDENTIFIER_OF_YOUR_VIEWCONTROLLER”]; 执行多次,然后每次创建新的* vc对象?那早期的* vc对象呢?这是内存泄漏吗?
阿维吉特·纳加里(Avijit Nagare)

@AvijitNagare Nah先生,感谢ARC(假设您正在使用它),引用将自动发布,因此您不必担心。如果您要创建多个具有相同名称的变量,这将导致编译器错误,因此甚至不允许您这样做。
塞缪尔·诺伊斯

好。表示UIViewController * vc = [故事板InstantiateViewControllerWithIdentifier:@“ IDENTIFIER_OF_YOUR‌_VIEWCONTROLLER”];每次创建新变量。但是ARC管理其内存。
阿维吉特·纳加里(Avijit Nagare)2016年

20

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

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

本示例假定您具有导航控制器以便返回上一个视图。当然,您也可以使用presentViewController:animated:completion:。要点是让情节提要板使用目标视图控制器的ID实例化目标视图控制器。


20

迅速

这将从情节提要中获取视图控制器并进行呈现。

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

适当更改情节提要板名称,视图控制器名称和视图控制器ID。


如果我在storeyboard中没有任何视图控制器,但我正在创建一个编程类该怎么办,我该如何以编程方式创建一个视图控制器并将其分配给一个类并进行演示
iOS开发人员

@iOSDeveloper,我不知道。
Suragch

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

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



1

is_背后的主要逻辑

NSString * storyboardIdentifier = @"SecondStoryBoard";

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

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

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

如果我在storeyboard中没有任何视图控制器,但我正在创建一个编程类该怎么办,我该如何以编程方式创建一个视图控制器并将其分配给一个类并进行演示
iOS开发人员

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 '16

0

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

KartViewController *viewKart = [[KartViewController alloc]initWithNibName:@"KartViewController" bundle:nil];
[self presentViewController:viewKart animated:YES completion:nil];

如果我在storeyboard中没有任何视图控制器,但我正在创建一个编程类该怎么办,我该如何以编程方式创建一个视图控制器并为其分配一个类并进行演示
iOS开发人员

上面的代码不需要任何情节提要,它将与xibs一起使用。
vijeesh

如果我既没有情节提要也没有xibs怎么办
iOS开发人员

初始化时不使用笔尖名称,然后尝试
vijeesh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.