Swiftを使用して1つのViewControllerから別のViewControllerに移動する方法


84

あるViewControllerから別のViewControllerに移動したいのですが。次の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 2016

回答:


208

2番目のViewController用のSwiftファイル(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 2014年

@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 value2行目に次のエラーが発生しました。助けてください
Raghavendra 2014

1
次のようなanimated:パラメータに問題があります:「式のタイプ '$ T7 ??'を変換できません 'BooleanLiteralConvertible' "と入力します。
Morkrom 2014

2
これを機能させるには、コントローラーがNavigationControllerに埋め込まれていることを確認する必要があります。埋め込まれていないと、エラーが発生します。
kakubei 2015

35

私の経験でnavigationControllerはゼロだったので、コードを次のように変更しました。

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

ViewControllerを設定することを忘れないでくださいStoryBoard IdStoryBoard- >identity inspector


2
これは、ViewControllerがNavigationViewControllerに組み込まれていなかったためです。
フランシス・レイノルズ

18

戻るボタンを表示したくない場合(ユーザーがログインした後に表示したかったので、これは私の場合でした)、navコントローラーのルートを設定する方法は次のとおりです。

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

swift4.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

Swift4.1およびXcode10の場合

ここにAddFileViewControllerは2番目のビューコントローラーです。

ストーリーボード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 2017

ここでは、ストーリーボード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);

私はそれがスウィフトかにObjCの構文ではないと思う
SPatel

1

スウィフト4

あなたが設定する必要がまず第一のナビゲーションコントローラを押して画面を切り替えることができますナビゲーションコントローラのUIViewControllerを

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

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

1

スウィフト5

Segueを使用して、あるViewControllerから別のViewControllerへのナビゲーションを実行します。

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

これはXcode10.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.