我使用以下代码以编程方式导航到另一个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)
答案 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。每个都有各自的屏幕。
该应用程序启动并显示“登录”屏幕。登录成功后,应用程序将打开“余额”屏幕。
这是它的外观:
登录成功的处理方法如下:
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