在Storyboard中使用导航控制器呈现视图控制器 - Swift

45
我目前正在下面的新storyboard中展示一个viewController:

我目前正在下面的新storyboard中展示一个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];

你如何在Swift中实现这个?

5个回答

109

你肯定走在正确的道路上。不幸的是,当你通过storyboard ID引用一个视图控制器时,它将忽略其被嵌入到任何东西中的事实。当你进行segue到嵌入式内容时,目标视图控制器将是嵌入控制器,而不是通常感兴趣的控制器。无论如何,你应该能够以类似你在Objective-C中所做的方式来解决问题,因此这只是一种语法移植的练习。

编辑:现在使用字符串定义storyboard名称

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 不是导航控制器的直接根视图控制器怎么办?我可以看到导航面板,但没有返回到它连接的上一个 ViewController 的按钮。 - shreddish
我不理解这个问题。 - Chris Wagner
很抱歉,我最终自己解决了这个问题...我想要回到导航栏堆栈的根视图控制器,然后推入另一个视图控制器。不过还是感谢你回复我。 - shreddish
你是如何在实例化控制器上添加返回按钮的呢?==> 回答:self.navigationController?.pushViewController(secondViewController, animated: true) - SKYnine
请注意:始终使用 NavigationController 包装 ViewController,然后再将其传递给方法 self.presentViewController(navigationController, animated: true, completion: nil)。 - kosiara - Bartosz Kosarzycki

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

        self.navigationController?.pushViewController(secondViewController, animated: true)

类名为:SecondCiewController

标识符名称


14

@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)

谢谢!!!


0

记得设置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)

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

navigationController?.pushViewController(vc, animated: true)

在这里,“SalesVC”可以是您想通过导航控制器移动到的视图控制器。 - Aditya A.Rajan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接