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];
sathish
fonte
Verifique isto: stackoverflow.com/a/38244058/1753005
Jayprakash Dubey

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

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

SWIFT 3.01

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

Em Swift 4.0

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

Swift 3

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

self.navigationController?.pushViewController(secondviewController, animated: true)
SAURAV JUSTIN
fonte
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) 
} 
iOS
fonte
3

In swift 3

let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController        
self.navigationController?.pushViewController(nextVC, animated: true)
Zeeshan
fonte
3
let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let home = storyBoard.instantiateViewController(withIdentifier: "HOMEVC") as! HOMEVC
navigationController?.pushViewController(home, animated: true);
Shanu Singh
fonte
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)
Davender Verma
fonte
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)
Azharhussain Shaikh
fonte
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.

Jerry Chong
fonte
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)
}
KPK
fonte