Objective-C の storyboard を Swift に移植する

誰得?な感じですが、必要となったときに参考にしてください。なぜ、必要に迫られているかというと、Objective‐C逆引き大全555の極意 を Swift 版に移植中なのです。先日 WWDC で Swift2 が発表になったので、結果的には Swift2 に移植することになるわけですが、まあ、両方買うと、Objective-C と Swift2 と相互に変換できて便利、という組み合わせな訳です。

その中で、最初はちまちまと Swfit 用の storyboard を書き直していたわけですが、storyboard 自体は中身が xml だし、そのままプロジェクト間をコピーしたら動かないか?と思ったわけです。結論から言えば、動きました。ViewController のクラス指定と、IBAction/IBOutlet に注意する必要がありますが、うまく手順を踏めば、きれいに動きます。

逆引きの場合、storyboard に 100 枚以上の ViewController が貼り付けてあって、その上に各種のコントローラがペタペタとついているんですよね。以前は、1項目を1プロジェクトに対応させていたのですが、プロジェクト自体が大量になって(起動が)面倒くさいのと、実機に入れてちまちまと動かすのには適当な単位でプロジェクト化しておいたほうが動作確認しやすいためです。まあ、そんなこともあって、Master-Detail プロジェクトを使って 100 枚程度の ViewController を行き来できるようにしてあります。

こんな感じにメニュー化されていて、

image

こんな風に遷移させています。

image

 

移行手順

ざっと、移行させるための手順は以下の通りに。

  1. 既存の Objective-C のプロジェクトを開く。
  2. 新規の Swift プロジェクトを作成する。
  3. 新規の Main.storyboard の名前を変えて、既存の Obj-C の Main.storyboard をコピー。
  4. Swift 側に、同じ名前で ViewControler を作成する。
  5. Swift 側に、同じ名前で、IBOutlet と IBAction を仮に用意する。
  6. ViewController の Custom Class 名を、一度、書き直させる。
    いったん、別の名前に設定して、元に戻すのでok(内部的な ID を振り直すために必須、)
    image
  7. Outlet を確認する。
    同じ名前で付けてあるはずなので、すべてが接続された状態になる。
    image

この状態でビルドをして実行をするとうまく動きます。ViewController のマッピング自体は、実行時に行われるので、画面を遷移させたときにエラーになるかどうかが分かります。うまく Outlet が設定されていない場合や、6 の時点で ViewController の ID の再割り付けが失敗している場合は、アプリケーションエラーになり、AppDelegate.swift で例外が発生します(これが訳が分からないので、再度 ViewController の再割り付けを確認するのが無難)。

実は、便利なのは storyboard が参照している ViewController をすべて揃えなくても良いことです。これは表示時に動的に参照されるので、使うところだけの ViewController を用意すれば良いわけです。なので、1枚1枚確認してから先に進むことができます。

まあ、画面を移行させても、中身は Swift なので書き直しが必須になる訳ですが、これはこれでそのまま使えるかなと。Xcode の場合プロジェクト間で、コントロールのコピー&ペーストができないので、storyboard そのままを移行させると便利ですね。この方法は、Swift 1.2 から Swift 2 への移行にも使えます。

カテゴリー: Objective-C, Swift パーマリンク