社内で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
以下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に画面遷移処理を書く
@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)を取得してあげましょう。