Je souhaite passer de ViewController à secondViewController, lorsque l'utilisateur appuie sur un bouton UIButton, en utilisant du code uniquement dans 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)
}
Le problème est que votre code crée un UIViewController vierge, pas un SecondViewController. Vous devez créer une instance de votre sous-classe, pas un UIViewController,
func transition(Sender: UIButton!) {
let secondViewController:SecondViewController = SecondViewController()
self.presentViewController(secondViewController, animated: true, completion: nil)
}
Si vous avez remplacé init (nibName nibName: String!, Bundle nibBundle: NSBundle!) Dans votre classe SecondViewController, vous devez modifier le code en,
let sec: SecondViewController = SecondViewController(nibName: nil, bundle: nil)
Cela a parfaitement fonctionné pour moi:
func switchScreen() {
let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
if let viewController = mainStoryboard.instantiateViewController(withIdentifier: "yourVcName") as? UIViewController {
self.present(viewController, animated: true, completion: nil)
}
}
rapide
Habituellement, pour la transition normale, nous utilisons,
let next:SecondViewController = SecondViewController()
self.presentViewController(next, animated: true, completion: nil)
Mais parfois, lorsque vous utilisez le contrôleur de navigation, vous pouvez être confronté à un écran noir. Dans ce cas, vous devez utiliser comme,
let next:ThirdViewController = storyboard?.instantiateViewControllerWithIdentifier("ThirdViewController") as! ThirdViewController
self.navigationController?.pushViewController(next, animated: true)
De plus, aucune des solutions ci-dessus ne conserve la barre de navigation lorsque vous appelez un storyboard ou un seul xib vers un autre xib. Si vous utilisez la barre de navigation et que vous souhaitez la conserver comme la Push normale, vous devez utiliser,
Disons que "MyViewController" est l'identifiant de MyViewController
let viewController = MyViewController(nibName: "MyViewController", bundle: nil)
self.navigationController?.pushViewController(viewController, animated: true)
Votre code est parfait. Si vous obtenez un écran noir, c'est parce qu'il n'y a rien sur votre deuxième contrôleur de vue.
Essayez quelque chose comme:
secondViewController.view.backgroundColor = UIColor.redColor();
Maintenant, le contrôleur de vue qu'il montre doit être rouge.
Pour faire quelque chose avec secondViewController
, créez une sous-classe de UIViewController
et au lieu de
let secondViewController:UIViewController = UIViewController()
créez une instance de votre second contrôleur de vue:
//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
Pour ceux qui utilisent un second contrôleur de vue avec un storyboard dans un fichier .xib, vous voudrez utiliser le nom du fichier .xib dans votre constructeur (sans le suffixe .xib).
let settings_dialog:SettingsViewController = SettingsViewController(nibName: "SettingsViewController", bundle: nil)
self.presentViewController(settings_dialog, animated: true, completion: nil)
Dans Swift 2.0, vous pouvez utiliser cette méthode:
let registrationView = LMRegistration()
self.presentViewController(registrationView, animated: true, completion: nil)
Pour ceux qui le font sur iOS8, voici ce que je devais faire:
J'ai un fichier de classe Swift intitulé SettingsView.Swift
et un fichier .xib nommé SettingsView.xib
. Je lance ceci dans MasterViewController.Swift
(ou n’importe quel contrôleur de vue pour ouvrir réellement un second contrôleur de vue)
@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)
}
Utilisez toujours le fichier nibName, sinon votre contenu préchargé de Xib ne s'affichera pas.
vc : ViewController = ViewController(nibName: "ViewController", bundle: nil) //change this to your class name
self.presentViewController(vc, animated: true, completion: nil)
Mis à jour pour Swift 3, certaines de ces réponses sont un peu dépassées.
let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let vc : UIViewController = mainStoryboard.instantiateViewController(withIdentifier: "myStoryboardID") as UIViewController
self.present(vc, animated: true, completion: nil) }