【问题标题】:Present View Controller in Storyboard with a Navigation Controller - Swift使用导航控制器在 Storyboard 中呈现视图控制器 - Swift
【发布时间】:2014-10-09 04:51:48
【问题描述】:

我目前在下面的新故事板中展示了一个 viewController:

var storyboard : UIStoryboard = UIStoryboard(name: AccountStoryboard, bundle: nil)
var vc : WelcomeViewController = storyboard.instantiateViewControllerWithIdentifier("WelcomeID") as WelcomeViewController
vc.teststring = "hello"        
self.presentViewController(vc, animated: true, completion: nil)

但是,这会呈现没有嵌入式导航控制器的视图控制器。 我尝试将“WelcomeID”更改为情节提要中的导航控制器 - 但没有成功。

我在 Objective-C 中得到了这个工作,但是不知道如何转换成 swift:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SetupStoryboard" bundle:nil];
UINavigationController *navigationController1 = [storyboard instantiateInitialViewController];
navigationController1.modalPresentationStyle = UIModalPresentationFormSheet;
navigationController1.modalTransitionStyle = UIModalTransitionStyleCoverVertical;

WelcomeViewController *vc = (WelcomeViewController *)navigationController1.viewControllers[0];
vc.teststring = @"Hello";

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

你如何快速做到这一点?

【问题讨论】:

    标签: ios uiviewcontroller uinavigationcontroller swift uistoryboard


    【解决方案1】:

    您绝对是在正确的轨道上。不幸的是,当您通过情节提要 ID 引用视图控制器时,它将忽略它嵌入任何内容的事实。当您选择嵌入的东西时,segues 也是如此,目标视图控制器将是嵌入控制器,而不是您通常感兴趣的控制器。无论如何,您应该能够以类似的方式解决问题Objective-C,所以这只是一个语法移植练习。

    编辑:现在用字符串定义故事板名称

    let storyboard : UIStoryboard = UIStoryboard(name: "AccountStoryboard", bundle: nil)
    let vc : WelcomeViewController = storyboard.instantiateViewControllerWithIdentifier("WelcomeID") as WelcomeViewController
    vc.teststring = "hello"        
    
    let navigationController = UINavigationController(rootViewController: vc)
    
    self.presentViewController(navigationController, animated: true, completion: nil)
    

    或者你可以给你的嵌入视图控制器一个 ID 并实例化它。

    【讨论】:

    • 如果目标 ViewController 不是导航控制器的直接 rootView 控制器怎么办?我正在获取导航窗格,但它没有返回其连接到的前一个 ViewController 的按钮。
    • 我不明白这个问题。
    • 很抱歉我最终弄明白了...我想弹回导航堆栈的根视图控制器,然后推送到另一个视图控制器。不过,我很感谢你回复我
    • 您是如何设法获得实例化控制器上的后退按钮的? ==> 答案:self.navigationController?.pushViewController(secondViewController, animated: true)
    • 注意:请记住始终用 NavigationController 包装 ViewController,然后才将其传递给方法 self.presentViewController(navigationController, animated: true, completion: nil)
    【解决方案2】:
     let secondViewController = self.storyboard?.instantiateViewControllerWithIdentifier("WelcomeID") as SecondViewController
    
            self.navigationController?.pushViewController(secondViewController, animated: true)
    

    类名是:SecondCiewController

    【讨论】:

      【解决方案3】:

      @Chris 给出的答案在旧版本的 swift 中效果很好。

      更新 Swift 3 和 Swift 4

         let storyboard : UIStoryboard = UIStoryboard(name: "AccountStoryboard", bundle: nil)
         let vc : WelcomeViewController = storyboard.instantiateViewController(withIdentifier: "WelcomeID") as! WelcomeViewController
         vc.teststring = "hello"
      
         let navigationController = UINavigationController(rootViewController: vc)
      
         self.present(navigationController, animated: true, completion: nil)
      

      谢谢!!!

      【讨论】:

        【解决方案4】:
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "SalesVC") as! SalesVC
        
        navigationController?.pushViewController(vc, animated: true)
        

        【讨论】:

        • 这里的“SalesVC”可以是您尝试通过导航控制器移动到的 ViewController
        【解决方案5】:

        记得设置 modalPresentationStyle 属性,在以编程方式呈现时,IB 设置将被忽略。

        let sb = UIStoryboard(name: "retail_carrello", bundle: nil)
            guard let carrelloVC = sb.instantiateViewController(withIdentifier: "mainCarrello") as? retail_carrello else { return }
        
            let navController = UINavigationController(rootViewController: carrelloVC)
        
            navController.modalPresentationStyle = .fullScreen //<--- remember to set up this if you need fullscreen
        
             present(navController, animated: true, completion: nil)
        

        【讨论】:

          猜你喜欢
          • 2018-11-09
          • 2021-01-03
          • 2014-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-03
          • 1970-01-01
          相关资源
          最近更新 更多