วิธีการนำทางจาก View Controller หนึ่งไปยังอีกตัวหนึ่งโดยใช้ Swift


85

ฉันต้องการนำทางจากตัวควบคุมมุมมองหนึ่งไปยังอีกมุมมองหนึ่ง ฉันจะแปลงรหัส Objective-C ต่อไปนี้เป็น Swift ได้อย่างไร

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

ตรวจสอบสิ่งนี้: stackoverflow.com/a/38244058/1753005
Jayprakash Dubey

คำตอบ:


210

สร้างไฟล์ที่รวดเร็ว (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

@ Sanjivani สวัสดีตัวควบคุมมุมมองของคุณสามารถสร้างได้ด้วย Storyboard และกำหนด firstViewController ของคุณเป็น rootViewController คลาสตัวควบคุมการนำทาง (รวดเร็ว) ของคุณจะมีลักษณะดังนี้: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
ฉันก็มีปัญหาเหมือนกันฉันติดขัดในการนำทางจาก ViewController หนึ่งไปยังอีกอันหนึ่ง เมื่อฉันลองใช้รหัสนี้ฉันได้รับข้อผิดพลาดนี้: unexpectedly found nil while unwrapping an Optional valueที่บรรทัดที่สองของรหัสของคุณ โปรดช่วย
Raghavendra

1
ฉันมีปัญหากับพารามิเตอร์ animated: ดังนี้: "ไม่สามารถแปลงนิพจน์ประเภท '$ T7 ??' เพื่อพิมพ์ 'BooleanLiteralConvertible' "
หมอกฤษณ์

2
คุณต้องตรวจสอบให้แน่ใจว่าตัวควบคุมของคุณฝังอยู่ใน NavigationController เพื่อให้ใช้งานได้มิฉะนั้นคุณจะได้รับข้อผิดพลาด
kakubei

35

จากประสบการณ์ของฉันnavigationControllerเป็นศูนย์ดังนั้นฉันจึงเปลี่ยนรหัสเป็นสิ่งนี้:

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

อย่าลืมตั้งค่า ViewController StoryBoard IdในStoryBoard->identity inspector


2
เนื่องจากตัวควบคุมมุมมองของคุณไม่ได้ลดลงในตัวควบคุมมุมมองการนำทาง
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

ใน Swift 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เป็นตัวควบคุมมุมมองที่สอง

รหัสสตอรี่บอร์ดคือ 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) 
}

หากคุณต้องการย้ายหลังจากเวลาผ่านไป

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

อย่างรวดเร็ว 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);

ฉันคิดว่ามันไม่ใช่ไวยากรณ์ของ Swift หรือ Objc
SPatel

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

คุณช่วยอธิบายสั้น ๆ ได้ไหมว่าโค้ดของคุณใช้ทำอะไรทำไมจึงแก้ปัญหาได้และแตกต่างจากคำตอบอื่น ๆ อย่างไร
JJJ

ที่นี่ฉันใช้ storyboard id เป็นตัวระบุ ผ่านการอ้างอิง (objViewController) ผลักดันการควบคุมไปที่คลาส View Controller
Davender Verma

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


ประเภทของการต่อ?
พัฒนา

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.