Posted at

StoryboardLintでidentifierの設定ミスから身を守る

More than 5 years have passed since last update.


背景

storyboardを使っていると、UITableViewCellのreuse identifiersやSegueにidentifierを設定し、それをもとにコードで参照することがあります。

例えば、以下のようにsegueに設定した名前を元に処理を行ったり、


HogeViewController.m

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

if ([[segue identifier] isEqualToString:@"NextSceneSegue"]) {
// ここで次のviewControllerのpropertyに値を設定する
}
}

UITableViewCellをとってきたりすると思います。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

HogeCell *cell = [self.detailView dequeueReusableCellWithIdentifier:@"HogeCell" forIndexPath:indexPath];
// cellを設定...

このとき、identifier("NextSceneSegue"や"HogeCell")は文字列で指定するため、うっかりtypoしてもbuildは成功してしまいます。typoしたまま動作確認しようとして期待通りに動かず、typoが原因であると気づいた時には脱力感に包まれることでしょう。

このような問題をStoryboardLintを使って解決します。


StoryboardLintとは

StoryboardLintは、Hoge.storyboardやFuga.xibの中身とソースコードを調査して、以下を適切に設定されているか調べてくれます。


  • CustomClassのクラス名

  • UITableViewCellやUICollectionViewCellなどのreuseIdentifiers

  • StoryboardとSegueのidentifiers

CLIで確認することもできますし、ちょっとした設定でXCode上でwarningを表示することもできるようになります。


基本的な使い方

以下のコマンドでinstallします。cocoapodsを使っている人はgemが使えると思いますが、もしgemを知らない場合、お近くのRubyistを捕まえるか、rubygemsでぐぐってください。

$ gem install storyboardlint

installが完了したらまずはCLIで動作確認してみます。segueに対し、意図的に間違った名前で参照しようとすると以下の様なwarningが表示されます。

$ cd # <.xcodprojがあるところ>

$ storyboardlint . --segue-suffix Segue
./Test/ViewController.m:36: warning: Segue ID 'FugaSegue' could not be found in any Storyboard.

ここで、optionとして--segue-suffix Segueとしていしていますが、これは標準ではsegueの名前の先頭にseg_を期待しているためです。私はsegueの名前は末尾にSegueとつけるようにしているため、それをoptionで指定しています。

同様に、標準ではreuse identifiersに対してはprefixにruid_、storyboardのidentifiersにはsb_を要求します。これらを変更したいときは以下のoptionを必要に応じて使用してください。



  • --segue-prefix --segue-suffix


  • --reuse-prefix --reuse-suffix


  • --storyboard-prefix --storyboard-siffix


XCodeでwarningを表示するには

StoryboardLintでは、次の画像のようにXcode上でwarningを確認することができます。

なお、下記画像は公式サイトより引用しています。

warning

warning

手順は以下のとおりです。合わせてanimated GIFもどうぞ。


  • projectのBuild PhaseRun Scriptを追加する

  • scriptのコマンドにstoryboardlint $SRCROOTを加える


    • 好みに応じてoptionを適当に追加して下さい



  • projectをbuildするとwarningが確認できる

storyboardlint.gif


最後に

些細なミスは早い段階で検出できると余計なトラブルを避ける事ができるので、storyboardやInterface Builderを使用しているのなら、念のため設定しておくと良いかもしれません。


参考リンク