【问题标题】:Call storyboard scene programmatically (without needing segue)?以编程方式调用情节提要场景(无需转场)?
【发布时间】:2012-05-09 19:38:15
【问题描述】:

我有一个模态故事板场景,我希望所有其他场景都可以访问它。从我的故事板上的每个场景中创建一个模态转场会导致到处都是乱七八糟的字符串。有没有办法让我摆脱转场并以编程方式调用场景?

基本上我想做这样的事情:

  MyNewViewController *myNewVC = [[MyNewViewController alloc] init];
  [self presentModalViewController:myNewVC animated:YES];

除了创建和推送视图控制器类之外,我想做一个模态转换到“孤立”(不与 segue 连接)情节提要场景。

【问题讨论】:

    标签: objective-c ios xcode uistoryboard


    【解决方案1】:

    是的,你可以。做这样的事情来访问 VC,然后只是 Modal Push 它:

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
    MyNewViewController *myVC = (MyNewViewController *)[storyboard instantiateViewControllerWithIdentifier:@"myViewCont"];
    

    【讨论】:

    • 这是否将场景作为模态视图推送(就像使用模态序列一样)?
    • 这取决于你如何呈现它。使用 [self presentModalViewController:myVC animated:YES];它会
    • 谢谢。我很困惑的一件事...... myVC 在第二行之后但在“presentModalViewController:myVC”行之前发生了什么?它只是隐藏在后台吗?
    • 刚刚分配和启动。我不太确定此时是否调用了“ViewDidLoad”,您必须记录它并查看。在展示它之前,您可以将事物分配给该 VC 中的变量。
    • 我怎样才能做同样的事情,但我想调用嵌套在导航控制器内的场景而不是模态场景?
    【解决方案2】:

    注意:presentModalViewController:animated 方法在 iOS 6 中已弃用。

    新代码应为:

    NSString * storyboardName = @"MainStoryboard_iPhone";
    NSString * viewControllerID = @"ViewID";
    UIStoryboard * storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
    MyViewController * controller = (MyViewController *)[storyboard instantiateViewControllerWithIdentifier:viewControllerID];
    [self presentViewController:controller animated:YES completion:nil];
    

    【讨论】:

    • 如果您想确保使用相同的故事板,也可以使用 self.storyboard。
    • 第一行的更多细节。虽然 presentModalViewController:animated is 已弃用,但其替代品是 presentViewController:animated,方法名称中间没有 Modal。乍一看可能不太清楚,因为函数调用看起来非常相似。
    【解决方案3】:

    在情节提要中为您的视图控制器提供一个标识符(在 Attributes Inspector 下),然后使用以下代码将该视图向前推进。

    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"STORYBOARDNAME" bundle:nil];
    UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"VIEWCONTROLLERIDENTIFIER"];
    [self presentModalViewController:vc animated:YES];
    

    【讨论】:

    • 这在 AppDelegate 中调用时似乎不起作用。
    • @radven ViewControllers 及其类不能从 AppDelegate 调用(我认为)...
    • @RazorSharp 真的吗?我一直在 AppDelegate 中调用 VC(根据需要)。例如(在我的脑海中),当设置一个根标签栏控制器时,我需要初始化标签中的视图控制器。现在,要显示内容,您需要在 App Delegate 的根视图控制器/情节提要等呈现中工作。
    【解决方案4】:

    我有一个案例,我想从应用程序的主要部分展示一个视图控制器,一个带有设置和帮助等的视图控制器。为此,我希望它位于导航控制器中,有点像我们可以从 UIBarButtonItem 调用的小插件模块。

    现在,这可以是/在当前故事板中,也可以是另一个,没关系。

    我想这样做,因为我讨厌故事板上到处都是连续线意大利面的潜力。

    这里是怎么做的。

    - (IBAction)displaySettings:(id)sender
    {
        LOG_SELECTOR() // google that for extra goodness
    
        // FYI, this can be done using a different storyboard like so.
        /*
         NSString * storyboardName = @"MainStoryboard_iPhone"; // possibly use device idiom?
         UIStoryboard * storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
         */
    
        // To push a new set of scenes with a new Navigation Controller, it is done like this:
        UINavigationController *settingsNC = [self.storyboard instantiateViewControllerWithIdentifier:@"Settings Nav Controller"];
        OBSettingsUIViewController *settingsVC = [self.storyboard instantiateViewControllerWithIdentifier:@"Settings root"];
        [settingsNC pushViewController:settingsVC animated:NO];
    
        [settingsNC setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
    
        // Present the view controller;
        [self presentViewController:settingsNC animated:YES completion:NULL];
    }
    

    在呈现的视图控制器(或导航控制器的子类)中,您可以使用 UIBarButtonItem 来关闭视图控制器的整个呈现层次结构,如下所示:

    - (IBAction)dismissThisVC:(id)sender {
         [self dismissViewControllerAnimated:YES completion:nil];
    }
    

    希望这可以帮助一群人。干杯。

    【讨论】:

      【解决方案5】:

      只需使用导航控制器调用viewcontroller 在 viewcontroller 中编写此代码,并在 storyboard 中设置 viewcontroller 为图像中的设置。

      ProfileVC *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"ProfileVC"];
      [self.navigationController pushViewController:vc animated:YES];
      

      【讨论】:

        【解决方案6】:

        调用导航到其他类

        UIWindow *window = [[[UIApplication sharedApplication] windows] objectAtIndex:0];
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
        
        UINavigationController *navController = (UINavigationController *)window.rootViewController;
        
        DumpFeed *dump = [storyboard instantiateViewControllerWithIdentifier:@"DumpFeed"];
        
        dump.isPushed=YES;
        
        dump.strUserId = appDelegate.strFriendid;
        
        
        [navController pushViewController:dump animated:YES];
        

        【讨论】:

          【解决方案7】:

          这是一个 Swift 版本:

          let storyboard = UIStoryboard(name: "Main", bundle: nil)
          let myVC = storyboard.instantiateViewControllerWithIdentifier("myStoryId")
          self.presentViewController(myVC, animated: true, completion: nil)
          

          您还应该像这样更改故事板 ID:

          【讨论】:

            【解决方案8】:

            我认为在 iOS7 中,通过故事板实现它变得非常容易

            我目前正在学习 iOS7 中的新功能并找到了这个简单的解决方案,但我不确定即使在以前的版本中它也可能相关。

            首先,您需要将呈现的 VC 与目标 VC 连接(这是唯一需要的连接),然后在情节提要的属性检查器中选择要模态的样式,在身份检查器中为您的 VC 提供一个 storyboardID 并确保您检查了“使用storyboardID”复选框,

            如果还没有此方法,请将此方法添加到您的presentingVC:

            - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
            
               YourTargetVC * targetVC = 
                     (YourTargetVC *)segue.destinationViewController;
            
               if(nil != targetVC) {
            
                   //Do preparations here
               }
            
            }
            

            现在,当您希望从 presentingVC 中显示您的 targetVC 时,您可以使用:

            [self performSegueWithIdentifier:(NSString *) sender:(id)];
            

            标识符是你的viewController的storyboardID,发送者是触发动作的视图,这个方法会调用storyboards场景,所以[prepareForSegue: sender:]方法会被调用,允许你在targetViewController出现之前进行最后的修改。

            【讨论】:

            • 问题是“无需转场”,因为“故事板到处都是乱七八糟的字符串”。
            • 谢谢,你是对的。但我认为最初的问题是在 iOS7 发布之前发布的。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-02-03
            • 2010-12-28
            • 1970-01-01
            • 1970-01-01
            • 2014-08-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多