Comment naviguer d'un contrôleur de vue à un autre à l'aide de Swift

84

Je voudrais naviguer d'un contrôleur de vue à un autre. Comment puis-je convertir le code Objective-C suivant en Swift?

UIViewController *viewController = [[self storyboard] instantiateViewControllerWithIdentifier:@"Identifier"];
UINavigationController *navi = [[UINavigationController alloc] initWithRootViewController:viewController];
[self.navigationController pushViewController:navi animated:YES];
sathish
la source
Vérifiez ceci: stackoverflow.com/a/38244058/1753005
Jayprakash Dubey

Réponses:

208

Créez un fichier swift (SecondViewController.swift) pour le deuxième contrôleur de vue et dans la fonction appropriée, tapez ceci:

let secondViewController = self.storyboard.instantiateViewControllerWithIdentifier("SecondViewController") as SecondViewController
self.navigationController.pushViewController(secondViewController, animated: true)


Swift 2+

let mapViewControllerObj = self.storyboard?.instantiateViewControllerWithIdentifier("MapViewControllerIdentifier") as? MapViewController
self.navigationController?.pushViewController(mapViewControllerObj!, animated: true)

Swift 4

let vc = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "IKDetailVC") as? IKDetailVC
self.navigationController?.pushViewController(vc!, animated: true)
Audrey Sobgou Zebaze
la source
@ audrey, Salut, comment définir navigationController?
Sanjivani
@Sanjivani, Salut, votre contrôleur de vue peut être créé avec Storyboard et attribuer votre firstViewController en tant que rootViewController.Votre classe de contrôleur de navigation (swift) ressemblera à ceci:import UIKit class SwiftNavigationController: UINavigationController { init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) // Custom initialization }`` override func viewDidLoad() { super.viewDidLoad() }
Audrey Sobgou Zebaze
3
J'ai également eu le même problème, j'étais bloqué sur la façon de naviguer d'un ViewController à un autre. Lorsque j'ai essayé ce code, j'obtiens cette erreur: unexpectedly found nil while unwrapping an Optional valueà la deuxième ligne de votre code. S'il vous plaît aider
Raghavendra
1
J'ai un problème avec le paramètre animé: comme ceci: "Impossible de convertir le type de l'expression '$ T7 ??' pour taper 'BooleanLiteralConvertible' ".
Morkrom du
2
Vous devez vous assurer que vos contrôleurs sont intégrés dans un NavigationController pour que cela fonctionne, sinon vous obtiendrez des erreurs.
kakubei
35

D'après mon expérience, navigationControllerc'était nul, alors j'ai changé mon code pour ceci:

let next = self.storyboard?.instantiateViewControllerWithIdentifier("DashboardController") as! DashboardController
self.presentViewController(next, animated: true, completion: nil)

N'oubliez pas de définir ViewController StoryBoard Iddans StoryBoard->identity inspector

Mojtabye
la source
2
Cela est dû au fait que votre contrôleur de vue n'a pas baissé dans un contrôleur de vue de navigation.
Francis Reynolds
18

Si vous ne voulez pas que le bouton de retour apparaisse (ce qui était mon cas, car je voulais le présenter après la connexion d'un utilisateur), voici comment définir la racine du contrôleur de navigation:

let vc = self.storyboard?.instantiateViewControllerWithIdentifier("YourViewController") as! YourViewController
        let navigationController = UINavigationController(rootViewController: vc)
        self.presentViewController(navigationController, animated: true, completion: nil)
Keith Holliday
la source
16

SWIFT 3.01

let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "Conversation_VC") as! Conversation_VC
self.navigationController?.pushViewController(secondViewController, animated: true)
Maksim Kniazev
la source
7

Dans Swift 4.0

var viewController: UIViewController? = storyboard().instantiateViewController(withIdentifier: "Identifier")
var navi = UINavigationController(rootViewController: viewController!)
navigationController?.pushViewController(navi, animated: true)
Rahul Phate
la source
4

Swift 3

let secondviewController:UIViewController =  self.storyboard?.instantiateViewController(withIdentifier: "StoryboardIdOfsecondviewController") as? SecondViewController

self.navigationController?.pushViewController(secondviewController, animated: true)
SAURAV JUSTIN
la source
4

Dans Swift 4.1 et Xcode 10

Ici, AddFileViewController est le deuxième contrôleur de vue.

L'identifiant du storyboard est AFVC

let next = self.storyboard?.instantiateViewController(withIdentifier: "AFVC") as! AddFileViewController
self.present(next, animated: true, completion: nil)

//OR

//If your VC is DashboardViewController
let dashboard = self.storyboard?.instantiateViewController(withIdentifier: "DBVC") as! DashboardViewController
self.navigationController?.pushViewController(dashboard, animated: true)

Si nécessaire, utilisez du fil.

Ex:

DispatchQueue.main.async { 
    let next = self.storyboard?.instantiateViewController(withIdentifier: "AFVC") as! AddFileViewController
    self.present(next, animated: true, completion: nil) 
}

Si vous voulez déménager après un certain temps.

EX:

//To call or execute function after some time(After 5 sec)
DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
    let next = self.storyboard?.instantiateViewController(withIdentifier: "AFVC") as! AddFileViewController
    self.present(next, animated: true, completion: nil) 
} 
iOS
la source
2

Dans Swift 3

let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController        
self.navigationController?.pushViewController(nextVC, animated: true)
Zeeshan
la source
2
let objViewController = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
self.navigationController?.pushViewController(objViewController, animated: true)
Davender Verma
la source
Pourriez-vous s'il vous plaît expliquer brièvement ce que fait votre code, pourquoi il résout le problème et en quoi il est différent de toutes les autres réponses.
JJJ
ici, j'utilise l'identifiant du storyboard comme identifiant. Via la référence (objViewController), poussez le contrôle vers la classe View Controller
Davender Verma
2
let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let home = storyBoard.instantiateViewController(withIdentifier: "HOMEVC") as! HOMEVC
navigationController?.pushViewController(home, animated: true);
Shanu Singh
la source
Je pense que ce n'est pas la syntaxe Swift ou Objc
SPatel
1

Swift 4

Vous pouvez changer d'écran en appuyant sur le contrôleur de navigation tout d'abord, vous devez régler le contrôleur de navigation avec UIViewController

let vc = self.storyboard?.instantiateViewController(withIdentifier: "YourStoryboardID") as! swiftClassName

self.navigationController?.pushViewController(vc, animated: true)
Azharhussain Shaikh
la source
1

Swift 5

Utilisez Segue pour effectuer la navigation d'un View Controller vers un autre View Controller:

performSegue(withIdentifier: "idView", sender: self)

Cela fonctionne sur Xcode 10.2.

Jerry Chong
la source
type de segue?
développeur
1

Dans AppDelegate, vous pouvez écrire comme ça ...

var window: UIWindow?

fileprivate let navigationCtrl = UINavigationController()

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    self.createWindow()

    self.showLoginVC()

    return true
}

func createWindow() {
    let screenSize = UIScreen.main.bounds
    self.window = UIWindow(frame: screenSize)
    self.window?.backgroundColor = UIColor.white
    self.window?.makeKeyAndVisible()
    self.window?.rootViewController = navigationCtrl
}

func showLoginVC() {
    let storyboardBundle = Bundle.main
    // let storyboardBundle = Bundle(for: ClassName.self) // if you are not using main application, means may be you are crating a framework or library you can use this statement instead
    let storyboard = UIStoryboard(name: "LoginVC", bundle: storyboardBundle)
    let loginVC = storyboard.instantiateViewController(withIdentifier: "LoginVC") as! LoginVC
    navigationCtrl.pushViewController(loginVC, animated: false)
}
KPK
la source