如何使用Swift代码转换到新的视图控制器

我想从ViewController转换到secondViewController,当用户按下一个UIButton,只在Swift中使用代码。

//Function to transition func transition(Sender: UIButton!) { //Current Code, default colour is black let secondViewController:UIViewController = UIViewController() self.presentViewController(secondViewController, animated: true, completion: nil) } 

问题是你的代码是创build一个空白的UIViewController,而不是一个SecondViewController。 你需要创build你的子类,而不是一个UIViewController,

 func transition(Sender: UIButton!) { let secondViewController:SecondViewController = SecondViewController() self.presentViewController(secondViewController, animated: true, completion: nil) } 

如果你在你的SecondViewController类中覆盖了init(nibName nibName:String!,绑定了nibBundle:NSBundle!),那么你需要改变代码,

 let sec: SecondViewController = SecondViewController(nibName: nil, bundle: nil) 

这对我来说非常合适:

 func switchScreen() { let mainStoryboard = UIStoryboard(name: "Storyboard", bundle: NSBundle.mainBundle()) let vc : UIViewController = mainStoryboard.instantiateViewControllerWithIdentifier("vcMainLogin") as UIViewController self.presentViewController(vc, animated: true, completion: nil) } 

你的代码很好。 你得到黑屏的原因是你的第二个视图控制器没有任何东西。

尝试像这样:

 secondViewController.view.backgroundColor = UIColor.redColor(); 

现在它显示的视图控制器应该是红色的。

要真正做一些事情与secondViewController ,创build一个UIViewController的子类,而不是

 let secondViewController:UIViewController = UIViewController() 

创build第二个视图控制器的实例:

 //If using code let secondViewController = MyCustomViewController.alloc() //If using storyboard, assuming you have a view controller with storyboard ID "MyCustomViewController" let secondViewController = self.storyboard.instantiateViewControllerWithIdentifier("MyCustomViewController") as UIViewController 

迅速

通常我们使用正常的转换,

 let next:SecondViewController = SecondViewController() self.presentViewController(next, animated: true, completion: nil) 

但有时使用导航控制器时,可能会遇到黑屏 。 在这种情况下,你需要使用像,

 let next:ThirdViewController = storyboard?.instantiateViewControllerWithIdentifier("ThirdViewController") as! ThirdViewController self.navigationController?.pushViewController(next, animated: true) 

而且,当你从故事板或单个xib调用另一个xib时,以上解决scheme都不会保留导航栏。 如果你使用导航栏,并想保持它就像正常推,你必须使用,

比方说,“MyViewController”是MyViewController的标识符

 let viewController = MyViewController(nibName: "MyViewController", bundle: nil) self.navigationController?.pushViewController(viewController, animated: true) 

对于在.xib文件中使用第二个视图控制器和故事板的用户,您将需要在构造函数中使用.xib文件的名称(不带..xib后缀)。

 let settings_dialog:SettingsViewController = SettingsViewController(nibName: "SettingsViewController", bundle: nil) self.presentViewController(settings_dialog, animated: true, completion: nil) 

对于任何人在iOS8上这样做,这是我必须做的:

我有一个名为SettingsView.swift名为SettingsView.swift的快速类文件和一个.xib文件。 我在MasterViewController.swift (或任何视图控制器真的打开第二个视图控制器)

 @IBAction func openSettings(sender: AnyObject) { var mySettings: SettingsView = SettingsView(nibName: "SettingsView", bundle: nil) /<--- Notice this "nibName" var modalStyle: UIModalTransitionStyle = UIModalTransitionStyle.CoverVertical mySettings.modalTransitionStyle = modalStyle self.presentViewController(mySettings, animated: true, completion: nil) } 

在Swift 2.0中,你可以使用这个方法:

  let registrationView = LMRegistration() self.presentViewController(registrationView, animated: true, completion: nil) 

总是使用nibName文件,否则预先加载的Xib内容将不会显示。

 vc : ViewController = ViewController(nibName: "ViewController", bundle: nil) //change this to your class name self.presentViewController(vc, animated: true, completion: nil)