最近、会社で開発しているプロジェクトで、Objective-Cで書いたコードをSwift化しているのですが、
UIButtonやUILabelのサブクラスをObjective-C→Swiftに書き換えた時に、
Storyboard/xib も修正しないといけなくなりました。
原因
どうやら、Swift化したことで、Storyboard/xibにカスタムクラスを設定した時に設定される__Module__という部分が設定されずに、
load時にクラスを読み込めずにクラッシュしたりしてしまうようです。
そう、 こやつ です。
storyboardを開いて、再度クラス名を入力することでcurrent - プロジェクト名
とModuleが入るのですが、
これを1つずつポチポチやるのは 非常に面倒 です。特に大きいプロジェクトだと使ってる場所が多かったり…
なので、これをコマンドラインでサクッとやってのけます。
コマンドラインで置換する
※Git等で前の状態にresetできるようにはしておきましょう。
以下のコマンドを叩くことで、プロジェクト内一括で指定したカスタムクラスを持つstoryboard/xibを修正することができます。
$ git grep -l 'customClass="クラス名">' | xargs sed -i '' -e 's/customClass="クラス名">/customClass="クラス名" customModule="Famm" customModuleProvider="target">/g'
# 複数行で見やすくするとこんな感じです
$ git grep -l 'customClass="クラス名">' \
| xargs sed -i '' -e \
's/customClass="クラス名">/customClass="クラス名" customModule="Famm" customModuleProvider="target">/g'
クラス名、プロジェクト名は、それぞれ入力する必要があります。
例えば、
- クラス名 : HogeButton
- プロジェクト名 : FooBar
なら、
$ git grep -l 'customClass="HogeButton">' | xargs sed -i '' -e 's/customClass="HogeButton">/customClass="HogeButton" customModule="FooBar" customModuleProvider="target">/g'
となります。
これで、Module未設定のものに関しては適切にModuleが設定されるようになります。
既に設定されているものには反映されません。
コマンドを打ち終わったら、git diff
等で差分を確認したり、storyboardを開くなりして、
こんな感じでcurrent
が設定されていることを確認します。
問題なければcommitして完了です。