【Swift】異なるStoryboard間での画面遷移、値渡しの方法
社内でiOSアプリ開発初心者に、
StoryboardをViewController単位で分けた場合の画面遷移、値渡し方法の説明時サンプルとして残しておく
環境
- Xcode: 11.3.1
- Swift5
・遷移先のUIViewController、StoryBoardを作成する
UIViewControllerを作成
- プロジェクトナビケータを右クリックし、New Fileを選択
- Cocoa Touch Classを選択
-
Class: NextViewController、 Subclass of: UIViewController、 Also Create XIB File: チェック外す、 Language:Swift
- Nextを選択
- そのままCreateでOK
StoryBoardを作成
- プロジェクトナビケータを右クリックし、New Fileを選択
- Storyboardを選択
- Nextを選択
- ファイル名を「Next」にし、CreateでOK
UIViewControllerを作成
- プロジェクトナビケータを右クリックし、New Fileを選択
- Cocoa Touch Classを選択
- Class: NextViewController、 Subclass of: UIViewController、 Also Create XIB File: チェック外す、 Language:Swift
- Nextを選択
- そのままCreateでOK
StoryBoardを作成
- プロジェクトナビケータを右クリックし、New Fileを選択
- Storyboardを選択
- Nextを選択
- ファイル名を「Next」にし、CreateでOK
以下4つが並んでいればOK
ViewController.swift
NextViewController.swift
Next.storyboard
Main.storyboard
Next.storyboardにViewControllerを設置、紐付け
- 画面右上のLibraryを選択し、View Controllerをドラッグし、StoryBoard上に表示する
- 1で追加したViewControllerを選択した状態で、Identity Inspectorを開く
- Custom Class のClass欄にNextViewControllerと入力し、Enter!
- Attributes Inspectorを開き、Is Initial View Controllerにチェックをいれる
・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)
}
}
@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を以下のように書き換え
@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を以下のように記載
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を使用していた場合、
前述のままでは値を渡すことができません。
ではどうするのか・・・
@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)を取得してあげましょう。
Author And Source
この問題について(【Swift】異なるStoryboard間での画面遷移、値渡しの方法), 我々は、より多くの情報をここで見つけました https://qiita.com/shuuujin/items/c0c4a5f55a5b26322fa3著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .