Swift以编程方式导航到另一个视图控制器/场景

时间:2016-09-12 12:17:28

标签: ios swift uinavigationbar viewcontroller

我使用以下代码以编程方式导航到另一个ViewController。它工作正常,但有些隐藏了navigation bar如何解决此问题?(如果重要,可以通过在ViewController中嵌入navigation controller来创建导航栏。)

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("nextView") as NextViewController
self.presentViewController(nextViewController, animated:true, completion:nil)

8 个答案:

答案 0 :(得分:134)

在Swift 3中

使用以编程方式创建的控制器

如果要导航到以编程方式创建的Controller,请执行以下操作:

let newViewController = NewViewController()
self.navigationController?.pushViewController(newViewController, animated: true)

使用StoryBoard创建控制器

如果您想使用标识符“newViewController”导航到StoryBoard上的Controller,请执行以下操作:

let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "newViewController") as! NewViewController
        self.present(newViewController, animated: true, completion: nil)

答案 1 :(得分:15)

SWIFT 4.x

双引号中的字符串总是使我感到困惑,所以我认为这个问题的答案需要一些图形化的显示才能解决。

对于银行应用程序,我有一个LoginViewController和BalanceViewController。每个都有各自的屏幕。

该应用程序启动并显示“登录”屏幕。登录成功后,应用程序将打开“余额”屏幕。

这是它的外观:

enter image description here

enter image description here

登录成功的处理方法如下:

let storyBoard: UIStoryboard = UIStoryboard(name: "Balance", bundle: nil)
let balanceViewController = storyBoard.instantiateViewController(withIdentifier: "balance") as! BalanceViewController
self.present(balanceViewController, animated: true, completion: nil)

如您所见,代码第二行中用小写字母表示的情节提要ID是“平衡”,这是在情节提要设置中定义的ID,如所附的屏幕截图所示。

带有大写字母B的术语“平衡”是 storyboard 文件的名称,该文件在代码的第一行中使用。

我们知道在代码中使用硬编码字符串是一种非常糟糕的做法,但是在iOS开发中以某种方式它已成为一种常见做法,而Xcode甚至没有警告它们。

答案 2 :(得分:13)

您应该使用当前导航控制器推送新的viewcontroller,而不是。

self.navigationController.pushViewController(nextViewController, animated: true)

答案 3 :(得分:6)

根据his answer中的@jaiswal Rajan。您可以像这样执行pushViewController:

let storyBoard: UIStoryboard = UIStoryboard(name: "NewBotStoryboard", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "NewViewController") as! NewViewController
self.navigationController?.pushViewController(newViewController, animated: true)

答案 4 :(得分:3)

因此,如果您提供视图控制器,它将不会显示在导航控制器中。它只需要完整的屏幕。在这种情况下,您必须创建另一个导航控制器并以此为根添加nextViewController并显示此新的navigationController。

另一种方法是推送视图控制器。

self.presentViewController(nextViewController, animated:true, completion:nil)

有关更多信息,请查看Apple文档: - https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/doc/uid/TP40006926-CH3-SW96

答案 5 :(得分:1)

上面的代码很好用,但是如果要从不能使用self.present的NSObject类进行导航。

 let storyBoard : UIStoryboard = UIStoryboard(name:"Main", bundle: nil)
        if  let conVC = storyBoard.instantiateViewController(withIdentifier: "SoundViewController") as? SoundViewController,
            let navController = UIApplication.shared.keyWindow?.rootViewController as? UINavigationController{
            navController.pushViewController(conVC, animated: true)

答案 6 :(得分:0)

OperationQueue.main.addOperation {
   let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
   let newViewController = storyBoard.instantiateViewController(withIdentifier: "Storyboard ID") as! NewViewController
   self.present(newViewController, animated: true, completion: nil)
}

当我将代码置于OperationQueue.main.addOperation内部时,它对我有用,它将在主线程中为我执行。

答案 7 :(得分:0)

所有其他答案听起来都不错,我想介绍一下我的情况,我必须制作一个动画的LaunchScreen,然后在动画3到4秒后,下一个任务是移到主屏幕。我尝试了segues,但是这为目标视图创建了问题。所以最后,我访问了AppDelegates的Window属性,并为其分配了一个新的NavigationController屏幕,

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let homeVC = storyboard.instantiateViewController(withIdentifier: "HomePageViewController") as! HomePageViewController
        //Below's navigationController is useful if u want NavigationController in the destination View
        let navigationController = UINavigationController(rootViewController: homeVC)
        appDelegate.window!.rootViewController = navigationController

如果是万一,您不想在目标视图中使用navigationController,只需将其分配为

let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let homeVC = storyboard.instantiateViewController(withIdentifier: "HomePageViewController") as! HomePageViewController
        appDelegate.window!.rootViewController = homeVC