350 votes

Instancier et présenter un viewController en Swift

Numéro

J'ai commencé à jeter un coup d'oeil sur le Swift Programming Language et, d'une manière ou d'une autre, je n'arrive pas à saisir correctement l'initialisation d'un UIViewController à partir d'un UIStoryboard .

Sur Objective-C J'écris simplement :

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"StoryboardName" bundle:nil];
UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"ViewControllerID"];
[self presentViewController:viewController animated:YES completion:nil];

Quelqu'un peut-il m'aider à réaliser cela avec Swift ?

7voto

Maxxafari Points 71
// "Main" is name of .storybord file "
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
// "MiniGameView" is the ID given to the ViewController in the interfacebuilder
// MiniGameViewController is the CLASS name of the ViewController.swift file acosiated to the ViewController
var setViewController = mainStoryboard.instantiateViewControllerWithIdentifier("MiniGameView") as MiniGameViewController
var rootViewController = self.window!.rootViewController
rootViewController?.presentViewController(setViewController, animated: false, completion: nil)

Cela a bien fonctionné pour moi quand je l'ai mis dans AppDelegate.

7voto

Hamid Points 344

Si vous voulez le présenter de manière modale, vous devriez avoir quelque chose comme ci-dessous :

let vc = self.storyboard!.instantiateViewControllerWithIdentifier("YourViewControllerID")
self.showDetailViewController(vc as! YourViewControllerClassName, sender: self)

6voto

vijeesh Points 804

Je voudrais suggérer une méthode beaucoup plus propre. Cela sera utile lorsque nous aurons plusieurs storyboards.

1. créer une structure avec tous vos storyboards.

struct Storyboard {
      static let main = "Main"
      static let login = "login"
      static let profile = "profile" 
      static let home = "home"
    }

2. Créez une extension UIStoryboard comme ceci

extension UIStoryboard {
  @nonobjc class var main: UIStoryboard {
    return UIStoryboard(name: Storyboard.main, bundle: nil)
  }
  @nonobjc class var journey: UIStoryboard {
    return UIStoryboard(name: Storyboard.login, bundle: nil)
  }
  @nonobjc class var quiz: UIStoryboard {
    return UIStoryboard(name: Storyboard.profile, bundle: nil)
  }
  @nonobjc class var home: UIStoryboard {
    return UIStoryboard(name: Storyboard.home, bundle: nil)
  }
}

Donnez l'identifiant du storyboard comme nom de classe, et utilisez le code suivant pour l'instancier

let loginVc = UIStoryboard.login.instantiateViewController(withIdentifier: "\(LoginViewController.self)") as! LoginViewController

0 votes

A quoi sert @nonobjc ?

1 votes

@StackRunner ceci ne sera pas disponible pour l'objectif c

5voto

Starwave Points 1759

Peu importe ce que j'ai essayé, cela n'a pas fonctionné pour moi - pas d'erreur, mais pas de nouveau contrôleur de vue sur mon écran non plus. Je ne sais pas pourquoi, mais en l'enveloppant dans la fonction timeout, cela a fini par fonctionner :

DispatchQueue.main.asyncAfter(deadline: .now() + 0.0) {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let controller = storyboard.instantiateViewController(withIdentifier: "TabletViewController")
    self.present(controller, animated: true, completion: nil)
}

3voto

Giang Points 1208

Swift 3 Storyboard

let settingStoryboard : UIStoryboard = UIStoryboard(name: "SettingViewController", bundle: nil)
let settingVC = settingStoryboard.instantiateViewController(withIdentifier: "SettingViewController") as! SettingViewController
self.present(settingVC, animated: true, completion: {

})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X