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