Як перейти від одного контролера перегляду до іншого за допомогою 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)


Свіфт 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, Привіт, ваш контролер перегляду можна створити за допомогою 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() }
Одрі Собу Зебазе

3
У мене також була та ж проблема, я застряг у тому, як переходити від одного ViewController до іншого. Коли я спробував цей код, я отримую таку помилку: unexpectedly found nil while unwrapping an Optional valueу другому рядку вашого коду. Будь ласка, допоможіть
Рагавендра

1
У мене проблема з анімованим параметром: приблизно так: "Не вдається перетворити тип виразу" $ 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
Це пов’язано з тим, що ваш контролер перегляду не стирався в контролері перегляду навігації.
Френсіс Рейнольдс,

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 - це другий контролер подання.

Ідентифікатор раскадровки - 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,

тут я використовую ідентифікатор розкадровки як ідентифікатор. Через посилання (objViewController) натисніть елемент керування до класу View Controller
Davender Verma

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 для здійснення навігації від одного контролера перегляду до іншого контролера перегляду:

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)
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.