Swift를 사용하여 한 뷰 컨트롤러에서 다른 뷰 컨트롤러로 이동하는 방법


84

한 뷰 컨트롤러에서 다른 뷰 컨트롤러로 이동하고 싶습니다. 다음 Objective-C 코드를 Swift로 어떻게 변환 할 수 있습니까?

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

답변:


208

두 번째 뷰 컨트롤러에 대한 신속한 파일 (SecondViewController.swift)을 생성하고 적절한 함수 유형에 다음을 입력합니다.

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)

스위프트 4

let vc = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "IKDetailVC") as? IKDetailVC
self.navigationController?.pushViewController(vc!, animated: true)

@audrey, 안녕하세요, navigationController를 설정하는 방법은 무엇입니까?
Sanjivani 2014-06-12

@Sanjivani, 하이 뷰 컨트롤러는 스토리 보드로 만든 rootViewController.Your 탐색 컨트롤러 (SWIFT) 클래스는 다음과 같이 표시됩니다로 firstViewController을 할당 할 수 있습니다 :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() }
오드리 Sobgou Zebaze

3
나는 또한 같은 문제가 있었고 하나의 ViewController에서 다른 ViewController로 이동하는 방법에 갇혀있었습니다. 이 코드를 시도했을 때 코드의 unexpectedly found nil while unwrapping an Optional value두 번째 줄 에이 오류가 발생 합니다. 도와주세요
Raghavendra 2014-08-08

1
animated : 매개 변수에 다음과 같은 문제가 있습니다. "식의 유형 '$ T7 ??'을 (를) 변환 할 수 없습니다." 'BooleanLiteralConvertible'을 입력합니다.
Morkrom

2
이것이 작동하려면 컨트롤러가 NavigationController에 포함되어 있는지 확인해야합니다. 그렇지 않으면 오류가 발생합니다.
kakubei 2015

35

내 경험상 navigationController아무것도 아니 었으므로 코드를 다음과 같이 변경했습니다.

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

의 ViewController를 설정하는 것을 잊지 마십시오 StoryBoard Id에서 StoryBoard->identity inspector


2
이는 뷰 컨트롤러가 Navigation View Controller에 ebbed되지 않았기 때문입니다.
Francis Reynolds

18

뒤로 버튼이 표시되지 않도록하려면 (사용자가 로그인 한 후 표시하고 싶었 기 때문에 내 경우) 다음은 내비게이션 컨트롤러의 루트를 설정하는 방법입니다.

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

신속한 4.0

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

4

스위프트 3

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

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

4

Swift 4.1 및 Xcode 10에서

여기서 AddFileViewController 는 두 번째 뷰 컨트롤러입니다.

스토리 보드 ID는 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)

필요한 경우 스레드를 사용하십시오 .

전의:

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

시간이 지나면 움직이고 싶다면 .

전의:

//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

신속한 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)

코드가 수행하는 작업, 문제를 해결하는 이유 및 다른 모든 답변과 다른 점을 간단히 설명해 주시겠습니까?
JJJ

여기에서는 스토리 보드 ID를 식별자로 사용하고 있습니다. 참조 (objViewController)를 통해 컨트롤을 View Controller 클래스로 푸시합니다
Davender Verma 2017 년

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

나는 그것이 Swift 또는 Objc 구문이 아니라고 생각합니다
SPatel

1

스위프트 4

당신은 당신이 설정해야합니다 우선 탐색 컨트롤러를 눌러 화면을 전환 할 수 있습니다 탐색 컨트롤러의 UIViewController를

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

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

1

스위프트 5

Segue를 사용하여 한 View Controller에서 다른 View Controller로 탐색을 수행합니다.

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

이것은 Xcode 10.2에서 작동합니다.


segue의 유형?
개발자

1

AppDelegate에서 다음과 같이 작성할 수 있습니다.

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)
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.