Ios 使用导航控制器-Swift在故事板中显示视图控制器

Ios 使用导航控制器-Swift在故事板中显示视图控制器,ios,uiviewcontroller,uinavigationcontroller,swift,uistoryboard,Ios,Uiviewcontroller,Uinavigationcontroller,Swift,Uistoryboard,我目前正在下面的新故事板中显示viewController: var storyboard : UIStoryboard = UIStoryboard(name: AccountStoryboard, bundle: nil) var vc : WelcomeViewController = storyboard.instantiateViewControllerWithIdentifier("WelcomeID") as WelcomeViewController vc.teststring

我目前正在下面的新故事板中显示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)
但是,这将显示没有嵌入式导航控制器的viewcontroller。 我尝试将“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];

您如何在swift中做到这一点?

您的思路绝对正确。不幸的是,当您通过情节提要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,并将其实例化

 let secondViewController = self.storyboard?.instantiateViewControllerWithIdentifier("WelcomeID") as SecondViewController

        self.navigationController?.pushViewController(secondViewController, animated: true)
类名为:SecondCiewController


在旧版本的swift中,@Chris给出的答案很有效

更新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)

谢谢

记住设置modalPresentationStyle属性,在“以编程方式呈现”中,IB设置将被忽略

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "SalesVC") as! SalesVC

navigationController?.pushViewController(vc, animated: true)
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)
let sb=UIStoryboard(名称:“retail_carrello”,捆绑:无)
guard let carrelloVC=sb.实例化视频控制器(标识符为:“Main Carrello”)作为?零售{carrello else{return}
让navController=UINavigationController(rootViewController:carrelloVC)

navController.modalPresentationStyle=.fullScreen//如果目标ViewController不是导航控制器的直接rootView控制器,该怎么办?我正在获取导航窗格,但它没有返回到它所连接的上一个ViewController的按钮。我不理解这个问题。很抱歉,我最终弄明白了。。。我想弹回到导航堆栈的根视图控制器,然后推到另一个视图控制器。感谢您回复我,您是如何获得实例化控制器上的“后退”按钮的?==>回答:self.navigationController?.pushViewController(secondViewController,动画:true)注意:请记住始终使用navigationController包装ViewController,然后将其传递给方法self。此处为“SalesVC”可以是您试图通过导航控制器移动到的ViewController