ViewControllerのテンプレとファイル生成時にAlso Create Storyboardを追加してみた


この記事はフラー Advent Calendar 2019の 2 日目の記事です。

弊社のiOSチームでは現在、 ViewControllerとStoryboardを1:1にする形で開発しています。

その中でいちいち、ViewControllerにテンプレコードを入れて、ViewControllerとStoryboardを作ってという、作業に嫌気がさしたので、ViewControllerを作成したら一連の作業が終わっているテンプレートを作りたいと思います。

1.ViewControllerにお約束コードを入れる

お約束コードというほどではないんですが、普通に作るとこうですね

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    /* 以下略 */
}

まずコメント消すの面倒だなと。
あと社内でXcode11からの変更を鑑みてMARK:をきちんと入れようという話になったので、それもテンプレに含めたいなと。

意: // MARK:を入れるとエディタで区切り線を入れられるよ
https://developer.apple.com/documentation/xcode_release_notes/xcode_11_release_notes

まあここは他でもまとめられているのでさっくりと行きます。
以下の階層にXcodeのテンプレート群があります。

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File\ Templates

そこのSourceフォルダ下にCocoa Touch Class.xctemplateがあります。
元ファイルをいじるのは後が怖いので、今回はコピーしてEdited Cocoa Touch Class.xctemplateを編集します。

Edited Cocoa Touch Class.xctemplate内のUIViewControllerSwiftフォルダ下にある___FILEBASENAME___.swiftを編集します。
今回はコメントを削除して、MARKを1つ追加しました。

//___FILEHEADER___

import UIKit

class ___FILEBASENAMEASIDENTIFIER___: ___VARIABLE_cocoaTouchSubclass___ {

    // MARK: - View Life Cycle
    override func viewDidLoad() {
        super.viewDidLoad()
    }

}

ちなみにテンプレートフォルダ内では編集できないので、適宜デスクトップなどに移して編集する必要があります

これでXcodeでファイルを追加するときに、編集したテンプレファイルを使用できます。

2. ViewControllerとStoryboardを同時生成する

まず、Edited Cocoa Touch Class.xctemplate内のUIViewControllerSwiftフォルダをコピーして、UIViewControllerStoryBoardSwiftを作ります。

次に以下の階層にある___FILEBASENAME___.storyboardUIViewControllerStoryBoardSwiftに入れます。

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates/User Interface/Storyboard.xctemplate

こんな感じになってれば、ViewControllerを作るときに、同名のStoryboardが生成されます。

ただ、このままだとStoryboardが必要ない場合も自動で生成されてしまうため、XIBファイルと同じようにチェックボックス式にします。
再びEdited Cocoa Touch Class.xctemplateに戻り、TemplateInfo.plistを開きます。

青枠で囲われている部分がAlso Create XIB fileの設定なので、コピーして、適宜書き換えます。

これでファイル生成時にAlso Create Storyboard fileを選択できるようになりました。

チェックボックスのデフォルトはTemplateInfo.plistからお好みで。
ちなみに、 どっちが編集したテンプレか一目でみたい場合は、

Edited Cocoa Touch Class.xctemplate内のTemplateIcon.pngを差し替えれば、

こんな感じで見分けられます。

終わりに

本当はStoryboardにView追加して、Classを紐付けて、Is Initial View Controllerにチェックつけるところまでやりたかったけど、sceneのIDを一意に振り分ける方法が見つからず断念しました。

本記事でテンプレート化できたのは半分までと言ったところなので、どうにかいい方法を見つけて次回の記事としたいと思います。