【问题标题】:How to call a View Controller programmatically?如何以编程方式调用视图控制器?
【发布时间】:2013-04-14 14:27:29
【问题描述】:

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

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

然后我尝试为每个人创建不同的UIViewControllers 并说:

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

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

使用未声明的标识符 ViewControllerMain。

在第二个中,它说:

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

我能做什么?

【问题讨论】:

  • 如何创建控制器?
  • 我在 MainStoryboard.storyboard 文件中创建了它们

标签: ios objective-c uiviewcontroller uistoryboard presentviewcontroller


【解决方案1】:

创建视图控制器:

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。

【讨论】:

  • 嗨@190290000卢布人。这可行,但我想从情节提要文件中显示一个已经创建的视图。这只是给了我一个空白的看法。有没有办法做到这一点?我正竭尽全力。我肯定有很多东西要学。
  • @JohnFarkerson:没问题!
  • 说,如果行代码 UIViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"IDENTIFIER_OF_YOUR_VIEWCONTROLLER"];执行多次然后每次都创建新的 *vc 对象?较早的 *vc 对象呢?这是内存泄漏吗?
  • @AvijitNagare Nah 伙计,感谢 ARC(假设您正在使用它)参考将自动发布,因此您不必担心。如果您要创建多个具有相同名称的变量,那将导致编译器错误,因此它甚至不允许您这样做。
  • 好的。表示 UIViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"IDENTIFIER_OF_YOUR‌​_VIEWCONTROLLER"];每次创建新变量。但 ARC 管理它的内存。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    斯威夫特

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

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

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

    【讨论】:

    • 如果我在层板中没有任何视图控制器,但我正在创建一个程序类,我如何以编程方式创建一个视图控制器并为其分配一个类并呈现它
    • @iOSDeveloper,我不知道。
    【解决方案4】:

    你可以这样调用 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
    

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

    【讨论】:

      【解决方案5】:

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

      1,如我在此处的回答中所述,在 Storyboard 中为您的 ViewController 创建一个 segue:How to perform a segue that is not related to user input in iOS 5?

      2,提供您的 ViewController 和标识符,并在此处使用我的答案中的代码调用它:Call storyboard scene programmatically (without needing segue)?

      【讨论】:

        【解决方案6】:

        这背后的主要逻辑是_,

        NSString * storyboardIdentifier = @"SecondStoryBoard";
        
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardIdentifier bundle: nil];
        
        UIViewController * UIVC = [storyboard instantiateViewControllerWithIdentifier:@"YourviewControllerIdentifer"];
        
        [self presentViewController:UIVC animated:YES completion:nil];
        

        【讨论】:

        • 如果我在层板中没有任何视图控制器,但我正在创建一个程序类,我如何以编程方式创建一个视图控制器并为其分配一个类并呈现它
        【解决方案7】:
                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 年历史,答案已被接受,如果您有宝贵的贡献,请解释它,而不仅仅是发布代码。
        【解决方案8】:

        导入要展示的视图控制器类,使用如下代码

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

        【讨论】:

        • 如果我在层板中没有任何视图控制器,但我正在创建一个程序类,我如何以编程方式创建一个视图控制器并为其分配一个类并呈现它
        • 以上代码不需要任何情节提要,它可以与xibs一起使用。
        • 如果我既没有故事板也没有 xibs 怎么办
        • 在没有笔尖名称的情况下初始化它并尝试
        猜你喜欢
        • 2021-04-28
        • 2016-05-05
        • 1970-01-01
        • 1970-01-01
        • 2014-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多