So navigieren Sie mit Swift von einem View Controller zu einem anderen


84

Ich möchte von einem View Controller zu einem anderen navigieren. Wie kann ich den folgenden Objective-C-Code in Swift konvertieren?

UIViewController *viewController = [[self storyboard] instantiateViewControllerWithIdentifier:@"Identifier"];
UINavigationController *navi = [[UINavigationController alloc] initWithRootViewController:viewController];
[self.navigationController pushViewController:navi animated:YES];

Antworten:


205

Erstellen Sie eine schnelle Datei (SecondViewController.swift) für den zweiten View Controller und geben Sie in der entsprechenden Funktion Folgendes ein:

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, Hallo, wie stelle ich den NavigationController ein?
Sanjivani

@ Sanjivani, Hallo, Ihr View Controller kann mit Storyboard erstellt werden und Ihren ersten ViewController als rootViewController zuweisen. Ihre Navigations-Controller-Klasse (schnell) sieht folgendermaßen aus: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
Ich hatte auch das gleiche Problem, ich war nicht sicher, wie ich von einem ViewController zum anderen navigieren sollte. Wenn ich diesen Code ausprobiert habe, wird folgende Fehlermeldung angezeigt: unexpectedly found nil while unwrapping an Optional valuein der zweiten Zeile Ihres Codes. Bitte helfen Sie
Raghavendra

1
Ich habe ein Problem mit dem animierten: -Parameter wie folgt: "Der Ausdruckstyp '$ T7 ??' kann nicht konvertiert werden. ' um 'BooleanLiteralConvertible' einzugeben ".
Morkrom

2
Sie müssen sicherstellen, dass Ihre Controller in einen NavigationController eingebettet sind, damit dies funktioniert. Andernfalls werden Fehler angezeigt.
Kakubei

35

Nach meiner Erfahrung navigationControllerwar es null, also habe ich meinen Code folgendermaßen geändert:

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

Vergessen Sie nicht, ViewController StoryBoard Idauf StoryBoard-> zu setzenidentity inspector


2
Dies liegt daran, dass Ihr View Controller in einem Navigation View Controller nicht verebbt wurde.
Francis Reynolds

18

Wenn Sie nicht möchten, dass die Schaltfläche "Zurück" angezeigt wird (was mein Fall war, weil ich sie nach dem Anmelden eines Benutzers präsentieren wollte), gehen Sie wie folgt vor, um das Stammverzeichnis des Navigationscontrollers festzulegen:

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

16

SWIFT 3.01

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

8

In schnellem 4.0

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

4

In Swift 4.1 und Xcode 10

Hier ist AddFileViewController der zweite View Controller.

Die Storyboard-ID lautet 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)

Bei Bedarf Gewinde verwenden.

Ex:

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

Wenn Sie nach einiger Zeit umziehen möchten .

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) 
} 

3

Swift 3

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

self.navigationController?.pushViewController(secondviewController, animated: true)

2

In schneller 3

let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController        
self.navigationController?.pushViewController(nextVC, animated: true)

2
let objViewController = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
self.navigationController?.pushViewController(objViewController, animated: true)

Könnten Sie bitte kurz erklären, was Ihr Code tut, warum er das Problem löst und wie er sich von allen anderen Antworten unterscheidet.
JJJ

Hier verwende ich die Storyboard-ID als Kennung. Über die Referenz (objViewController) schieben Sie das Steuerelement in die View Controller-Klasse
Davender Verma

2
let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let home = storyBoard.instantiateViewController(withIdentifier: "HOMEVC") as! HOMEVC
navigationController?.pushViewController(home, animated: true);

Ich denke, es ist nicht Swift oder Objc Syntax
SPatel

1

Swift 4

Sie können den Bildschirm wechseln, indem Sie zuerst den Navigationscontroller drücken. Zunächst müssen Sie den Navigationscontroller mit UIViewController einstellen

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

self.navigationController?.pushViewController(vc, animated: true)

1

Swift 5

Verwenden Sie Segue, um die Navigation von einem View Controller zu einem anderen View Controller durchzuführen:

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

Dies funktioniert unter Xcode 10.2.


Art des Segues?
Entwickler

1

In AppDelegate können Sie so schreiben ...

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)
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.