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


この記事は[フラー Advent Calendar 2019](https://adventar.org/calendars/4155)の 2 日目の記事です。

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

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

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

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

```swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

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

    /* 以下略 */
}
```
まずコメント消すの面倒だなと。
あと社内でXcode11からの変更を鑑みて`MARK:`をきちんと入れようという話になったので、それもテンプレに含めたいなと。
![スクリーンショット 2019-12-02 17.14.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329127/97085910-c0ba-abd0-e69c-407b696436dd.png)
意： `// 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`を編集します。
<img width="920" alt="スクリーンショット 2019-12-02 17.34.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329127/fbe54617-e7e4-152e-7465-86cea04538c4.png">

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

```swift
//___FILEHEADER___

import UIKit

class ___FILEBASENAMEASIDENTIFIER___: ___VARIABLE_cocoaTouchSubclass___ {

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

}
```


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

これでXcodeでファイルを追加するときに、編集したテンプレファイルを使用できます。
![スクリーンショット 2019-12-02 17.43.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329127/75d1adc3-0a59-e796-fdde-d5efdd219e6f.png)

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

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


次に以下の階層にある`___FILEBASENAME___.storyboard`を`UIViewControllerStoryBoardSwift`に入れます。

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

こんな感じになってれば、ViewControllerを作るときに、同名のStoryboardが生成されます。
<img width="764" alt="スクリーンショット 2019-12-02 18.15.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329127/2a51cb4e-d49b-e2ea-6881-9d0954cee588.png">

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

![スクリーンショット 2019-12-02 18.20.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329127/57ea6928-a11b-0c3c-6b87-ad4ead04fd36.png)

青枠で囲われている部分が`Also Create XIB file`の設定なので、コピーして、適宜書き換えます。
![スクリーンショット 2019-12-02 18.22.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329127/c81fbac0-078d-4326-fc6b-b7c9720999c9.png)

これでファイル生成時に`Also Create Storyboard file`を選択できるようになりました。
![スクリーンショット 2019-12-02 18.23.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329127/2fc3fb2e-e1b6-1e22-09b2-264dee00a23e.png)

チェックボックスのデフォルトは`TemplateInfo.plist`からお好みで。
ちなみに、 どっちが編集したテンプレか一目でみたい場合は、
![スクリーンショット 2019-12-02 18.40.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329127/2df0f537-51a4-7240-2e3f-ad59efeb57da.png)

`Edited Cocoa Touch Class.xctemplate`内の`TemplateIcon.png`を差し替えれば、
![スクリーンショット 2019-12-02 18.52.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329127/05c5b026-5a4e-6dad-83b0-80f5453e261f.png)
こんな感じで見分けられます。

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

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