- iOS
- 2017-05-12 - 更新:2018-09-18
アプリ開発をしていく中で様々な画面を作成していくと、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