1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2020-06-18

社内で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上に表示する
    スクリーンショット 2020-06-18 13.08.40.png
  2. 1で追加したViewControllerを選択した状態で、Identity Inspectorを開く
  3. Custom Class のClass欄にNextViewControllerと入力し、Enter!
  4. Attributes Inspectorを開き、Is Initial View Controllerにチェックをいれる

以下のようになっていればOK
スクリーンショット 2020-06-18 14.20.03.png スクリーンショット 2020-06-18 14.20.17.png

#・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名はお任せします

###この時点で動作確認
nextGif.gif

#・画面遷移の際に、値も渡したい
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を設置し、ソースコードと紐付けしておいて下さい。

###動作確認
nextgif2.gif
ViewController.swiftから値を渡すことができました!

#・遷移先がNavigationControllerを使用している場合
スクリーンショット 2020-06-18 16.07.20.png
上記のように遷移先の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)を取得してあげましょう。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?