【Swift】異なるStoryboard間での画面遷移、値渡しの方法


社内でiOSアプリ開発初心者に、
StoryboardをViewController単位で分けた場合の画面遷移、値渡し方法の説明時サンプルとして残しておく

環境

  • Xcode: 11.3.1
  • Swift5

・遷移先のUIViewController、StoryBoardを作成する

UIViewControllerを作成

  1. プロジェクトナビケータを右クリックし、New Fileを選択
  2. Cocoa Touch Classを選択
  3. Class: NextViewController、 Subclass of: UIViewController、 Also Create XIB File: チェック外す、 Language:Swift
  4. Nextを選択
  5. そのままCreateでOK

StoryBoardを作成

  1. プロジェクトナビケータを右クリックし、New Fileを選択
  2. Storyboardを選択
  3. Nextを選択
  4. ファイル名を「Next」にし、CreateでOK

以下4つが並んでいればOK
ViewController.swift
NextViewController.swift
Next.storyboard
Main.storyboard

Next.storyboardにViewControllerを設置、紐付け

  1. 画面右上のLibraryを選択し、View Controllerをドラッグし、StoryBoard上に表示する
  2. 1で追加したViewControllerを選択した状態で、Identity Inspectorを開く
  3. Custom Class のClass欄にNextViewControllerと入力し、Enter!
  4. Attributes Inspectorを開き、Is Initial View Controllerにチェックをいれる

以下のようになっていればOK

・ViewController.swiftに画面遷移処理を書く

ViewController.swift
    @IBAction func didTapNextButton(_ sender: UIButton) {
        // ここに画面遷移処理(NextViewControllerに遷移する処理)を記載
        let storyboard: UIStoryboard = UIStoryboard(name: "Next", bundle: nil)
        if let vc = storyboard.instantiateInitialViewController() {
            self.present(vc, animated: true, completion: nil)
        }
    }

※事前にMain.storyboard内のViewControllerにUIButtonを設置し、ソースコードと紐付けしておいて下さい。
※紐付けの際はIBActionで、function名はお任せします

この時点で動作確認

・画面遷移の際に、値も渡したい

ViewController.swiftを以下のように書き換え

ViewController.swift
    @IBAction func didTapNextButton(_ sender: UIButton) {
        // ここに画面遷移処理(NextViewControllerに遷移する処理)を記載
        let storyboard: UIStoryboard = UIStoryboard(name: "Next", bundle: nil)
        if let vc = storyboard.instantiateInitialViewController(), let nextVc = vc as? NextViewController {
            // NextViewControllerのメンバ変数valueに文字列を代入
            nextVc.value = "私は二郎系ラーメンが大好きです!"
            self.present(vc, animated: true, completion: nil)
        }
    }

NextViewController.swiftを以下のように記載

NextViewController.swift
class NextViewController: UIViewController {

    @IBOutlet weak var dispLabel: UILabel!
    var value: String = ""

    override func viewDidLoad() {
        super.viewDidLoad()
        // 受け取った値をUILabelで表示
        self.dispLabel.text = self.value
    }
}

※事前にNext.storyboard内のViewControllerにUILabelを設置し、ソースコードと紐付けしておいて下さい。

動作確認


ViewController.swiftから値を渡すことができました!

・遷移先がNavigationControllerを使用している場合


上記のように遷移先のNextViewControllerがNavigationControllerを使用していた場合、
前述のままでは値を渡すことができません。
ではどうするのか・・・

ViewController.swift
    @IBAction func didTapNextButton(_ sender: UIButton) {
        // ここに画面遷移処理(NextViewControllerに遷移する処理)を記載
        let storyboard: UIStoryboard = UIStoryboard(name: "Next", bundle: nil)
        if let navigationVc = storyboard.instantiateInitialViewController() as? UINavigationController,
            let nextVc = navigationVc.topViewController as? NextViewController {
            nextVc.value = "私は二郎系ラーメンが大好きです!"
            self.present(navigationVc, animated: true, completion: nil)
        }
    }

storyboardから取得できるのはUINavigationControllerになるので、
NavigationControllerの最前面にあるViewController(NextViewController)を取得してあげましょう。