Come passare da un controller di visualizzazione a un altro utilizzando Swift


84

Mi piacerebbe navigare da un controller di visualizzazione a un altro. Come posso convertire il seguente codice Objective-C in Swift?

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

Risposte:


208

Crea un file swift (SecondViewController.swift) per il secondo controller di visualizzazione e nella funzione appropriata digita questo:

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, ciao, come impostare navigationController?
Sanjivani

@Sanjivani, Ciao, il tuo controller di visualizzazione può essere creato con Storyboard e assegna il tuo firstViewController come rootViewController. La tua classe di controller di navigazione (swift) sarà simile a questa: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
Ho anche avuto lo stesso problema, ero bloccato su come navigare da un ViewController a un altro. Quando ho provato questo codice, ricevo questo errore: unexpectedly found nil while unwrapping an Optional valuenella seconda riga del tuo codice. Si prega di aiutare
Raghavendra

1
Ho un problema con il parametro animato: in questo modo: "Impossibile convertire il tipo di espressione" $ T7 ?? " per digitare "BooleanLiteralConvertible" ".
Mork dal

2
Devi assicurarti che i tuoi controller siano incorporati in un NavigationController affinché funzioni, altrimenti otterrai errori.
kakubei

35

Nella mia esperienza navigationControllerera pari a zero, quindi ho cambiato il mio codice in questo:

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

Non dimenticare di impostare ViewController StoryBoard Idin StoryBoard->identity inspector


2
Questo perché il controller della vista non è stato abbassato in un controller della vista di navigazione.
Francis Reynolds

18

Se non vuoi che appaia il pulsante Indietro (che era il mio caso, perché volevo presentare dopo che un utente ha effettuato l'accesso) ecco come impostare la radice del controller di navigazione:

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)

7

In swift 4.0

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

4

Swift 3

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

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

4

In Swift 4.1 e Xcode 10

Qui AddFileViewController è il secondo controller di visualizzazione.

L'ID dello storyboard è 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)

Se necessario, utilizzare il filo.

Ex:

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

Se vuoi muoverti dopo un po 'di tempo.

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

2

In swift 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)

Potresti spiegare brevemente cosa fa il tuo codice, perché risolve il problema e come è diverso da tutte le altre risposte.
JJJ

qui sto usando l'ID dello storyboard come identificatore. Tramite il riferimento (objViewController) spingere il controllo alla 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);

Penso che non sia la sintassi Swift o Objc
SPatel

1

Swift 4

Puoi cambiare schermata premendo il controller di navigazione prima di tutto devi impostare il controller di navigazione con UIViewController

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

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

1

Swift 5

Usa Segue per eseguire la navigazione da un controller di visualizzazione a un altro controller di visualizzazione:

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

Funziona su Xcode 10.2.


tipo di segue?
developper

1

In AppDelegate puoi scrivere così ...

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)
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.