Swift 以编程方式导航到另一个视图 controller/scene

Swift programmatically navigate to another view controller/scene

我正在使用以下代码以编程方式导航到另一个 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)

您应该使用当前不存在的导航控制器推送新的 viewcontroller。

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

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

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

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

Swift 5

默认的模式呈现样式是卡片。这在顶部显示了先前的视图控制器,并允许用户滑动显示的视图控制器。

要保留旧样式,您需要像这样修改要呈现的视图控制器:

newViewController.modalPresentationStyle = .fullScreen

这对于以编程方式创建的控制器和故事板创建的控制器都是相同的。

Swift 3

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

如果您想导航到以编程方式创建的控制器,请执行以下操作:

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

使用故事板创建控制器

如果您想使用标识符 "newViewController" 导航到 StoryBoard 上的控制器,请执行以下操作:

let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "newViewController") as! NewViewController
        self.present(newViewController, animated: true, completion: nil)
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 时,它对我有用,它将在我的主线程中执行。

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

SWIFT 4.x

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

对于银行应用程序,我有一个 LoginViewController 和一个 BalanceViewController。各有各的画面。

应用启动并显示登录屏幕。登录成功后,应用会打开余额屏幕。

外观如下:

登录成功是这样处理的:

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

如您所见,小写字母的情节提要ID 'balance' 是代码第二行中的内容,这是情节提要设置中定义的ID,如所附屏幕截图所示.

大写'B'的术语'Balance'是故事板文件的名称,用在代码的第一行。

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

所有其他答案听起来都不错,我想介绍一下我的情况,我必须制作一个动画 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

以上代码运行良好,但如果您想从 NSObject class 导航,您不能使用 self.present:

let storyBoard = 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)
}