自定义 Xcode project template

不喜欢使用storyboard。而新建一个Single View Application工程后,总是要删除Main.stroyboard、修改工程配置、创建显示window。于是,就想能不能自定义一个工程模板来做这些事。参考一些资料后就有了这篇文章

目标:新建这样一个project template

  1. 不包含Main.storyboard;
  2. 在AppDelegate.m中自动引入#import "ViewController.h"
  3. 自动创建并显示Windows
    效果图如下:


    图1

Xcode 8的有两种project templates:

  1. xcode定义的project templates。存放在目录
    /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates

    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates(这是iOS的project templates,其他平台的project templates这里没列出);
  2. 用户自定义的project templates;
    存放目录为:
    ~/Library/Developer/Xcode/Templates
    默认情况~/Library/Developer/Xcode/目录下没有Templates文件夹,需要手动创建。
    在终端中输入以下命令可搜索到所有包含工程模板的路径
    sudo find / -name Templates
    结果如下
    图2

我们经常使用的Single View Application工程模板所在目录为:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/iOS/Application/Single View Application.xctemplate
我们自定义的project template就是参考的这个project template。
准备工作就到这了,下面开始创建自定义的工程模板。

一、在选择工程模板的面板中显示自定义的工程模板

效果如下图:


图3
  1. 在用户定义project templates目录下创建和Single View Application.xctemplate模板同样的目录结构,即在~/Library/Developer/Xcode/下创建如下目录结构:
    Templates/Project Templates/iOS/Application/Single View No Storyboard.xctemplate/
    (其中Single View No Storyboard.xctemplate/自定义模板的名字)
    完整的目录结构为:
    ~/Library/Developer/Xcode/Templates/Project Templates/iOS/Application/Single View No Storyboard.xctemplate/
  2. 拷贝Single View Application.xctemplate下的
    TemplateIcon.png
    TemplateIcon@2x.png
    TemplateInfo.plist

    Single View No Storyboard.xctemplate。
    (我们要的就是不包含Main.storyboard的工程,所以不拷贝这个文件)
    要拷贝的文件如下图


    图4
  3. 修改模板图标和标识模板
    图3中包含两个平图片,这个图片就是图2中显示的模板的图标。该图标可改可不改。修改或替换时注意命名和图片尺寸要和原图一样。
    每个模板都有一个唯一的ID用于识别和区分模板,这个ID就是TemplateInfo.plist
    中的identifier。拷贝TemplateInfo.plist之后要修改这个identifier字段。本文中修改为com.apple.dt.unit.singleViewApplicationNoStoryboard,如图4
    图5

    至此、保存TemplateInfo.plist,再新建工程的时候就会弹出如图2那样的模板选择面板。

二、自定义模板

现在我们已经做好的自定义的模板的入口。接下来就是真正的自定义模板了。
具体操作如下:

  1. 在逻辑上删除Main.storyboard
    删除自定义模板的TemplateInfo.plist中的Ancestors节点下的com.apple.dt.unit.storyboardApplication,如下图


    图6
  2. 在AppDelegate.m中自动引入#import "ViewController.h"、自动创建并显示Windows
    在Option->Item0->Units->Objective-C->Nodes下添加两条数据
    AppDelegate.m:imports:importHeader:ViewController.h
    AppDelegate.m:implementation:methods:applicationdidFinishLaunchingWithOptions:body
    然后再在Option->Item0->Units->Objective-C下添加一条字典类型的数据Definitions,其中key为
    AppDelegate.m:implementation:methods:applicationdidFinishLaunchingWithOptions:body
    value为

// Override point for customization after application launch.
_window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
_window.backgroundColor = [UIColor whiteColor];
_window.rootViewController = [ViewController new];
[_window makeKeyAndVisible];

如下图


图7

注意:以上内容是基于xcode 8.3制作。以后新版xcode可能会有不同。但思路及时这个思路。

推荐阅读更多精彩内容