カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

複数のStoryboardを使った画面遷移

この記事は最終更新日から1年以上経過しています。

アプリ開発をしていく中で様々な画面を作成していくと、Storyboardが複雑化してしまいます。
そこで、シーンをグループ分けしStoryboardを分割することで開発が楽になります。

今回は別のStoryboardのシーンへ遷移させる方法をご紹介します。

新規ファイルでStoryboardを追加します。

通常はMain.storyboardがありますので、Sub.storyboardを作成します。

ViewControllerを追加し、Storyboard IDを設定します。

仮に「sub_exam」としておきます。

あとは遷移したいところに以下のコードを追加するだけです。

let SubStoryboard: UIStoryboard = UIStoryboard(name: "Sub", bundle: nil)
let subExam: UIViewController = SubStoryboard.instantiateViewController(withIdentifier: "sub_exam")
show(subExam, sender: nil)

Sub.storyboardのViewControllerをイニシャルビューとしている場合は以下のようになります。

let subExam: UIViewController = SubStoryboard.instantiateInitialViewController() as! UIViewController


またMain.storyboardでNavigation Controllerを使っている場合、Sub.storyboardのViewに遷移しても戻れるようにするには
Sub.storyboardにもNavigation Controllerが必要なのかな?と思いましたが、必要ないようです。
モーダルで表示してSubはSubだけの中で遷移すれば良いのであればSub.storyboardにもNavigation Controllerが必要にはなります。

パラメータの受け渡し

通常、同じStoryboard内ではSegueを使って画面遷移を作成します。
その場合はパラメータの受け渡しはSegueを使って渡すことができますが、今回のケースでStoryboardを移動していますのでSegueでの値渡しができません。

対処法としてはAppDelegateを使います。

まずはAppDelegate.swiftにプロパティを追加します。

class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    var id: Int = 0 // <-渡したいプロパティ

値を渡す側の処理

let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.id = 1
// この後画面遷移の処理

値を受け取る側の処理

let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate
print(String(appDelegate.id))

以上でパラメータの受け渡しをすることができます。

Xcode: 8.3.2
Swift: 3.1
OS: Sierra 10.12

2018.09.18 追記

Swift 4になって書き方が変わったようです。
イニシャルビューの場合のみ。

let SubStoryboard: UIStoryboard = UIStoryboard(name: "Sub", bundle: nil)
let subExam: UIViewController = SubStoryboard.instantiateInitialViewController()!
show(subExam, sender: nil)

Xcode: 10.0
Swift: 4.2
OS: High Sierra 10.13.6

この記事がお役に立ちましたらシェアお願いします
4,952 views

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です