vaguely

和歌山に戻りました。ふらふらと色々なものに手を出す毎日。

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

意外にハマったのでメモ。

Storyboardを複数作成して、イベント発生時に次のStoryboardを開く方法は、Objective-Cだと以下のような感じで実現できます。

[iOS] 複数のStoryboardを使って画面遷移を作成する - Developers.IO

今回はSwiftを使って、Main.storyboard (ViewController.swift)からNext.storyboard (NextViewController.swift)へと遷移するようにします。

準備

  1. Single View ApplicationでSwiftのプロジェクトを作成します
  2. 遷移先画面として、Next.storyboard とコントローラーである NextViewController.swift を作成します
  3. Xcode画面左のNavigatorで、Step2で作成したStoryboardをクリックします
  4. 画面右のUtilities>Identity Inspector>Identity>Storyboard ID に「NextView」と入力します
  5. プロジェクトと同時に作成されている 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 Controller

  • UITableViewControllerで、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を持ちたい場合はこれで良さそうです(自信はないです)。

参考