web-dev-qa-db-fra.com

Swift presentViewController

J'ai par programme plusieurs contrôleurs de vue dans un projet Swift iOS. Je n'ai pas les storyboards et je voudrais les éviter si possible. Existe-t-il un moyen de passer à un autre fichier viewcontroller.Swift (nous l'appellerons view2.Swift) et de l'inclure dans une fonction qu'un bouton appelle?
J'ai essayé ce qui suit:

let storyboard: UIStoryboard = UIStoryboard(name: "myTabBarName", bundle: nil)
let vc: UIViewController = storyboard.instantiateViewControllerWithIdentifier("myVCID") as UIViewController
self.presentViewController(vc, animated: true, completion: nil)

Ce qui précède fonctionne avec les storyboards, mais je souhaite qu’un autre view2.Swift soit appelé. Cela peut-il être fait?

63
Z-Tech

Essaye ça:

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

Avec Swift3:

self.present(vc, animated: true, completion: nil)
101
Adam

Pour ceux qui obtiennent des écrans vierges/noirs, ce code a fonctionné pour moi.

    let vc = self.storyboard?.instantiateViewController(withIdentifier: myVCID) as! myVCName
    self.present(vc, animated: true, completion: nil)

Pour définir "Identificateur" sur votre VC, il vous suffit de vous rendre dans l'inspecteur d'identité du VC du storyboard. Définissez «ID Storyboard» sur ce que vous souhaitez identifier. Regardez l'image ci-dessous pour référence .

86
boidkan

Pour référence, parce que cette question est l'un des premiers résultats de Google.

Briser le changement dans Swift 3:

La méthode presentViewController est remplacée par la méthode present.

Vous pouvez l'utiliser comme l'ancien:

self.present(viewControllerToPresent, animated: true, completion: nil)

Exemple pour ouvrir la caméra:

let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = UIImagePickerControllerSourceType.camera
imagePicker.allowsEditing = false
self.present(imagePicker, animated: true, completion: nil)
19
Arnlen

Swift 3 et Swift 4

let vc = self.storyboard?.instantiateViewController(withIdentifier: "idMyViewControllerName") as! MyViewControllerName
self.present(vc, animated: true, completion: nil)
13
Kaptain

Pour moi, j'avais deux vues dans deux contrôleurs de navigation distincts. Je devais utiliser une combinaison de ce qui précède.

var vc = self.storyboard?.instantiateViewControllerWithIdentifier("WelcomeViewController") as! WelcomeViewController
    var navigationController = UINavigationController(rootViewController: vc)
    self.presentViewController(navigationController, animated: true, completion: nil)

Swift 3.x

        let secondVC = self.storyboard?.instantiateViewController(withIdentifier: "VC-ID" as! yourViewController
        let navigationVC = UINavigationController(rootViewController: secondVC)
        self.present(navigationVC, animated: true, completion: nil)
7
Keith Holliday

Utilisation de Swift 2.1+

 let vc = self.storyboard?.instantiateViewControllerWithIdentifier("settingsVC") as! SettingsViewController
 self.presentViewController(vc, animated: true, completion: nil)

 enter image description here

6
ColossalChris

Utilisez simplement ceci: Assurez-vous que l'utilisation de nibName, sinon les vues préchargées de xib ne s'afficheront pas:

var vc : ViewController = ViewController(nibName: "ViewController", bundle: nil) // remplacez ceci par votre nom de classe

 self.presentViewController(vc, animated: true, completion: nil)
4
Alok

Résolution de l’écran noir en ajoutant un contrôleur de navigation et en définissant le second contrôleur de vue sur rootVC.

let vc = ViewController()       
var navigationController = UINavigationController(rootViewController: vc)
self.presentViewController(navigationController, animated: true, completion: nil
2
AMG

Vous pouvez utiliser le code:

if let vc = self.storyboard?.instantiateViewController(withIdentifier: "secondViewController") as? secondViewController {
   let appDelegate = UIApplication.shared.delegate as! AppDelegate
   appDelegate.window?.rootViewController = vc
}
0
tvtruong

Vous pouvez utiliser le code ci-dessous: 

var vc = self.storyboard?.instantiateViewControllerWithIdentifier("YourViewController") as! YourViewController;
            vc.mode_Player = 1
            self.presentViewController(vc, animated: true, completion: nil)
0

Il n'est pas nécessaire d'instancier ViewController dans Storyboard uniquement pour que present() ViewController fonctionne. C'est une solution bidon. 

Si vous voyez un écran noir/blanc lors de la présentation d'un VC, c'est peut-être parce que vous appelez present() à partir de viewDidLoad() dans le premier/RootViewController, mais que la première vue n'est pas encore prête.

Appelez present() à partir de viewDidAppear pour résoudre ce problème, à savoir:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    let yourVC = YourViewController()
    self.present(yourVC, animated: true, completion: nil)
}

Une fois qu'une "vue" est apparue dans votre application, vous pouvez commencer à appeler present () à partir de viewDidLoad()


Utiliser UINavigationController (comme suggéré dans une réponse) est une autre option, mais il pourrait être excessif de résoudre ce problème. Vous pourriez finir par compliquer le flux d'utilisateurs. Utilisez la solution UINavigationController uniquement si vous souhaitez disposer d'une NavigatonBar ou si vous souhaitez revenir au contrôleur de vue précédent.

0
Nitin Nain

Une autre possibilité est que le fichier XIB ne soit pas inclus dans votre cible de génération (ce qui m’est arrivé à moi).

Cela peut arriver si vous avez une cible différente pour les versions Dev, Test & Release (que vous devriez avoir de toute façon).

0
Ger