不喜欢使用storyboard。而新建一个Single View Application工程后,总是要删除Main.stroyboard、修改工程配置、创建显示window。于是,就想能不能自定义一个工程模板来做这些事。参考一些资料后就有了这篇文章
目标:新建这样一个project template
- 不包含Main.storyboard;
- 在AppDelegate.m中自动引入#import "ViewController.h"
-
自动创建并显示Windows
效果图如下:
Xcode 8的有两种project templates:
- 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这里没列出); - 用户自定义的project templates;
存放目录为:
~/Library/Developer/Xcode/Templates
默认情况~/Library/Developer/Xcode/目录下没有Templates文件夹,需要手动创建。
在终端中输入以下命令可搜索到所有包含工程模板的路径
sudo find / -name Templates
结果如下
我们经常使用的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。
准备工作就到这了,下面开始创建自定义的工程模板。
一、在选择工程模板的面板中显示自定义的工程模板
效果如下图:
- 在用户定义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/ -
拷贝Single View Application.xctemplate下的
TemplateIcon.png
TemplateIcon@2x.png
TemplateInfo.plist
到
Single View No Storyboard.xctemplate。
(我们要的就是不包含Main.storyboard的工程,所以不拷贝这个文件)
要拷贝的文件如下图
- 修改模板图标和标识模板
图3中包含两个平图片,这个图片就是图2中显示的模板的图标。该图标可改可不改。修改或替换时注意命名和图片尺寸要和原图一样。
每个模板都有一个唯一的ID用于识别和区分模板,这个ID就是TemplateInfo.plist
中的identifier。拷贝TemplateInfo.plist之后要修改这个identifier字段。本文中修改为com.apple.dt.unit.singleViewApplicationNoStoryboard,如图4
至此、保存TemplateInfo.plist,再新建工程的时候就会弹出如图2那样的模板选择面板。
二、自定义模板
现在我们已经做好的自定义的模板的入口。接下来就是真正的自定义模板了。
具体操作如下:
-
在逻辑上删除Main.storyboard
删除自定义模板的TemplateInfo.plist中的Ancestors节点下的com.apple.dt.unit.storyboardApplication,如下图
在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];
如下图
注意:以上内容是基于xcode 8.3制作。以后新版xcode可能会有不同。但思路及时这个思路。