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];
sathish
quelle
Überprüfen Sie dies: stackoverflow.com/a/38244058/1753005
Jayprakash Dubey

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 Sobgou Zebaze
quelle
@ 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

Mojtabye
quelle
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)
Keith Holliday
quelle
16

SWIFT 3.01

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

In schnellem 4.0

var viewController: UIViewController? = storyboard().instantiateViewController(withIdentifier: "Identifier")
var navi = UINavigationController(rootViewController: viewController!)
navigationController?.pushViewController(navi, animated: true)
Rahul Phate
quelle
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) 
} 
iOS
quelle
3

Swift 3

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

self.navigationController?.pushViewController(secondviewController, animated: true)
SAURAV JUSTIN
quelle
2

In schneller 3

let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController        
self.navigationController?.pushViewController(nextVC, animated: true)
Zeeshan
quelle
2
let objViewController = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
self.navigationController?.pushViewController(objViewController, animated: true)
Davender Verma
quelle
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);
Shanu Singh
quelle
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)
Azharhussain Shaikh
quelle
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.

Jerry Chong
quelle
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)
}
Kunal Kansara
quelle