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.