Swiftで複数のStoryboardを使った画面遷移
意外にハマったのでメモ。
Storyboardを複数作成して、イベント発生時に次のStoryboardを開く方法は、Objective-Cだと以下のような感じで実現できます。
[iOS] 複数のStoryboardを使って画面遷移を作成する - Developers.IO
今回はSwiftを使って、Main.storyboard (ViewController.swift)からNext.storyboard (NextViewController.swift)へと遷移するようにします。
準備
- Single View ApplicationでSwiftのプロジェクトを作成します
- 遷移先画面として、Next.storyboard とコントローラーである NextViewController.swift を作成します
- Xcode画面左のNavigatorで、Step2で作成したStoryboardをクリックします
- 画面右のUtilities>Identity Inspector>Identity>Storyboard ID に「NextView」と入力します
- プロジェクトと同時に作成されている Main.storyboard にボタンを追加して、IBOutletとIBActionを ViewController.swift に追加します
ViewController.swift
import UIKit class ViewController: UITableViewController { @IBOutlet weak var btnStart: UIButton! var stbNextView: UIStoryboard! var nvcNextViewCtrl: NextViewController! override func viewDidLoad() { super.viewDidLoad() // 遷移先のStoryboardの準備 stbNextView = UIStoryboard(name: "Next", bundle: nil) nvcNextViewCtrl = stbNextView!.instantiateViewControllerWithIdentifier("NextView") as NextViewController } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } @IBAction func btnStartTouched(sender: UIButton) { // 次のStoryboardを表示する self.presentViewController(nvcNextViewCtrl, animated:false, completion: nil) } }
- UIStoryboardの名前はStoryboardの名前(拡張子なし)を、instantiateViewControllerWithIdentifierには準備のStep4で入力したStoryboard IDを指定します。
なお画面遷移には関係ありませんが、以下もメモっておきます。
実行時に真っ黒な画面が表示され、Main.storyboardが表示されない場合は、Main.storyboardをNavigatorでクリックして以下にチェックが入っているかを確認します。
Utilities>Attributes Inspector>View Controller>Is Initial View ControllerUITableViewControllerで、Table View Cellを追加してそのままのサイズにしておくとアラートが表示されました。
「Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view.」
Utilities>Size Inspector>Table View Cell>Row Heightの値を変更してやるとアラートは表示されなくなったので、静的にTable View Cellを持ちたい場合はこれで良さそうです(自信はないです)。