Как перейти от одного контроллера представления к другому с помощью Swift

84

Я хотел бы перейти от одного контроллера представления к другому. Как я могу преобразовать следующий код 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
Джайпракаш Дубей 07

Ответы:

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)

Swift 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. Ваш класс контроллера навигации (swift) будет выглядеть следующим образом: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во второй строке вашего кода. Пожалуйста, помогите
Рагхавендра
1
У меня проблема с анимированным параметром: например: "Невозможно преобразовать тип выражения '$ T7 ??' для типа BooleanLiteralConvertible ".
Morkrom
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

Mojtabye
источник
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

Swift 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) 
} 
iOS
источник
3

В быстром 3

let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController        
self.navigationController?.pushViewController(nextVC, animated: true)
Zeeshan
источник
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
здесь я использую идентификатор раскадровки в качестве идентификатора. Через ссылку (objViewController) переместите элемент управления в класс View Controller
Davender Verma,
1

Swift 4

Вы можете переключать экран, нажимая на контроллер навигации, прежде всего, вы должны установить контроллер навигации с помощью UIViewController

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

self.navigationController?.pushViewController(vc, animated: true)
Азхархуссайн Шейх
источник
1

Swift 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)
}
КПК
источник