Cách điều hướng từ View Controller này sang View Controller khác bằng Swift


84

Tôi muốn điều hướng từ bộ điều khiển chế độ xem này sang bộ điều khiển chế độ xem khác. Làm cách nào để chuyển đổi mã Objective-C sau đây thành Swift?

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

Câu trả lời:


208

Tạo một tệp nhanh (SecondViewController.swift) cho bộ điều khiển chế độ xem thứ hai và trong hàm thích hợp, hãy nhập hàm này:

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, Xin chào, làm thế nào để đặt điều hướngController?
Sanjivani

@Sanjivani, Hi khiển xem của bạn có thể được tạo ra với Storyboard và gán firstViewController của bạn như rootViewController.Your navigation Controller (nhanh chóng) lớp sẽ trông như thế này: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
Tôi cũng gặp vấn đề tương tự, tôi bị mắc kẹt ở cách điều hướng từ ViewController này sang ViewController khác. Khi tôi thử mã này, tôi gặp lỗi này: unexpectedly found nil while unwrapping an Optional valueở dòng thứ hai của mã của bạn. Vui lòng giúp đỡ
Raghavendra

1
Tôi đang gặp sự cố với tham số animation: như vậy: "Không thể chuyển đổi loại biểu thức '$ T7 ??' để nhập 'BooleanLiteralConvertible' ".
Morkrom

2
Bạn cần đảm bảo rằng bộ điều khiển của bạn được nhúng trong NavigationController để điều này hoạt động, nếu không bạn sẽ gặp lỗi.
kakubei

35

Theo kinh nghiệm của tôi navigationControllerlà không, vì vậy tôi đã thay đổi mã của mình thành:

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

Đừng quên đặt ViewController StoryBoard Idtrong StoryBoard->identity inspector


2
Điều này là do bộ điều khiển chế độ xem của bạn không được đặt trong Bộ điều khiển Chế độ xem Điều hướng.
Francis Reynolds

18

Nếu bạn không muốn nút quay lại xuất hiện (đó là trường hợp của tôi, vì tôi muốn trình bày sau khi người dùng đăng nhập) thì đây là cách đặt gốc của bộ điều khiển điều khiển:

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)

8

Trong 4.0 nhanh chóng

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

Trong Swift 4.1 và Xcode 10

Ở đây AddFileViewController là bộ điều khiển chế độ xem thứ hai.

Id bảng phân cảnh là 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)

Nếu yêu cầu sử dụng chủ đề.

Ví dụ:

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

Nếu bạn muốn di chuyển sau một thời gian.

VÍ DỤ:

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

Trong 3 nhanh

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)

Bạn có thể vui lòng giải thích ngắn gọn mã của bạn làm gì, tại sao nó giải quyết vấn đề và nó khác với tất cả các câu trả lời khác như thế nào.
JJJ

ở đây tôi đang sử dụng id bảng phân cảnh làm định danh. Thông qua tham chiếu (objViewController) đẩy điều khiển đến lớp View Controller
Da cam Verma

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

tôi nghĩ rằng nó không phải Swift hay ObjC cú pháp
SPatel

1

Swift 4

Bạn có thể chuyển đổi màn hình bằng cách đẩy bộ điều khiển điều hướng trước hết bạn phải đặt bộ điều khiển điều hướng với UIViewController

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

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

1

Swift 5

Sử dụng Segue để thực hiện điều hướng từ một View Controller sang View Controller khác:

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

Điều này hoạt động trên Xcode 10.2.


loại segue?
Developper

1

Trong AppDelegate, bạn có thể viết như thế này ...

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)
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.