Como navegar de um controlador de visualização para outro usando o Swift


84

Eu gostaria de navegar de um controlador de visualização para outro. Como posso converter o seguinte código Objective-C em Swift?

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

Respostas:


210

Crie um arquivo swift (SecondViewController.swift) para o segundo controlador de visualização e no tipo de função apropriado:

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, Olá, como definir o NavigationController?
— Sanjivani de

@Sanjivani, Olá, seu controlador de visualização pode ser criado com Storyboard e atribua seu firstViewController como rootViewController. Sua classe de controlador de navegação (swift) será semelhante a: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
Eu também tive o mesmo problema, não sabia como navegar de um ViewController para outro. Quando tentei este código, recebo este erro: unexpectedly found nil while unwrapping an Optional valuena segunda linha do seu código. Por favor ajude
— Raghavendra

1
Estou tendo um problema com o parâmetro animated: assim: "Não é possível converter o tipo da expressão '$ T7 ??' para digitar 'BooleanLiteralConvertible' ".
— Morkrom

2
Você precisa ter certeza de que seus controladores estão embutidos em um NavigationController para que isso funcione, caso contrário, você receberá erros.
— kakubei de

35

Em minha experiência navigationControllerfoi nulo, então mudei meu código para este:

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

Não se esqueça de definir ViewController StoryBoard Idem StoryBoard->identity inspector


2
Isso ocorre porque o seu controlador de visualização não diminuiu em um controlador de visualização de navegação.
— Francis Reynolds,

18

Se você não quiser que o botão Voltar apareça (que foi o meu caso, porque eu queria apresentar depois que um usuário fez login), aqui está como definir a raiz do controlador de navegação:

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

Em 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

Em Swift 4.1 e Xcode 10

Aqui, AddFileViewController é o segundo controlador de visualização.

O id do 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 necessário, use fio.

Ex:

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

Se você quiser se mudar depois de algum 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) 
} 

3

In swift 3

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

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

acho que não é sintaxe Swift ou Objc
— SPatel

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

Você poderia explicar brevemente o que seu código faz, por que ele resolve o problema e como ele é diferente de todas as outras respostas.
— JJJ de

aqui estou usando a id do storyboard como identificador. Por meio da referência (objViewController), envie o controle para a classe View Controller
— Davender Verma

1

Swift 4

Você pode mudar a tela pressionando o controlador de navegação primeiro de tudo, você deve definir o controlador de navegação com UIViewController

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

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

1

Swift 5

Use o Segue para realizar a navegação de um View Controller para outro View Controller:

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

Isso funciona no Xcode 10.2.


tipo de segue?
— desenvolvedor de

1

Em AppDelegate você pode escrever assim ...

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)
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.