Cómo navegar de un controlador de vista a otro usando Swift

84

Me gustaría navegar de un controlador de vista a otro. ¿Cómo puedo convertir el siguiente código Objective-C en Swift?

UIViewController *viewController = [[self storyboard] instantiateViewControllerWithIdentifier:@"Identifier"];
UINavigationController *navi = [[UINavigationController alloc] initWithRootViewController:viewController];
[self.navigationController pushViewController:navi animated:YES];
sathish
fuente
Compruebe esto: stackoverflow.com/a/38244058/1753005
Jayprakash Dubey

Respuestas:

208

Cree un archivo rápido (SecondViewController.swift) para el segundo controlador de vista y en la función apropiada escriba esto:

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)

Rápido 4

let vc = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "IKDetailVC") as? IKDetailVC
self.navigationController?.pushViewController(vc!, animated: true)
Audrey Sobgou Zebaze
fuente
@ audrey, Hola, ¿cómo configurar navigationController?
Sanjivani
@Sanjivani, Hola, su controlador de vista se puede crear con Storyboard y asignar su firstViewController como rootViewController. Su clase de controlador de navegación (swift) se verá así: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
También tuve el mismo problema, estaba atascado en cómo navegar de un ViewController a otro. Cuando probé este código, recibí este error: unexpectedly found nil while unwrapping an Optional valueen la segunda línea de su código. Por favor ayuda
Raghavendra
1
Tengo un problema con el parámetro animated: como este: "No se puede convertir el tipo de expresión '$ T7 ??' para escribir 'BooleanLiteralConvertible' ".
Mork desde el
2
Debe asegurarse de que sus controladores estén integrados en un NavigationController para que esto funcione; de ​​lo contrario, obtendrá errores.
kakubei
35

En mi experiencia navigationControllerfue nula, así que cambié mi código a esto:

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

No olvide configurar ViewController StoryBoard Iden StoryBoard->identity inspector

Mojtabye
fuente
2
Esto se debe a que su controlador de vista no se redujo en un controlador de vista de navegación.
Francis Reynolds
18

Si no desea que aparezca el botón Atrás (que era mi caso, porque quería presentar después de que un usuario iniciara sesión), aquí se explica cómo configurar la raíz del controlador de navegación:

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

SWIFT 3.01

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

En Swift 4.0

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

Swift 3

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

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

En Swift 4.1 y Xcode 10

Aquí AddFileViewController es el segundo controlador de vista.

La identificación del guión gráfico es 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 es necesario, utilice hilo.

Ex:

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

Si quieres mudarte después de un tiempo.

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
fuente
2

En Swift 3

let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController        
self.navigationController?.pushViewController(nextVC, animated: true)
Zeeshan
fuente
2
let objViewController = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
self.navigationController?.pushViewController(objViewController, animated: true)
Davender Verma
fuente
¿Podría explicar brevemente qué hace su código, por qué resuelve el problema y en qué se diferencia de todas las demás respuestas?
JJJ
aquí estoy usando la identificación del guión gráfico como identificador. A través de la referencia (objViewController), empuje el control a la clase 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
fuente
Creo que no es sintaxis Swift u Objc
SPatel
1

Rápido 4

Puede cambiar la pantalla presionando el controlador de navegación.En primer lugar, debe configurar el controlador de navegación con UIViewController

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

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

Rápido 5

Utilice Segue para realizar la navegación desde un controlador de vista a otro controlador de vista:

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

Esto funciona en Xcode 10.2.

Jerry Chong
fuente
tipo de segue?
desarrollador
1

En AppDelegate puedes escribir así ...

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
fuente