xcode5 自定义模板
经过一番周折,终于在xcode5上实现了一个简单的自定义模板,在项目中集成NSLogger库(增强NSLog的功能,https://github.com/fpillet/NSLogger)——新建项目中自动加入LoggerClient.h,LoggerClient.m ,LoggerCommon.h以及一些Frameworks。
如果从零开始定义一个模板,未免太过复杂,最简单的方法就是把系统模板复制过来修改^_^。
系统模板路径:
//路径1
Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates
//路径2
Xcode.app/Contents/Developer/Library/Xcode/Templates
可以看到,两个路径下的模板都分为File Templates和Project Templates两种。顾名思义,文件模板用于创建文件,项目模板用于创建项目,这里需要的是Project Templates。这里在Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/下找到Single View Application.xctemplate模板,复制到自定义模板路径下。
自定义模板的存放位置:
~/Library/Developer/Xcode/Templates
如果之前安装过cocos2d,那么在上面路径下就可以看到cocos2d的库文件。借鉴cocos2d和PhoneGap的做法,把Single View Application.xctemplate放在路径3下:
//路径3
~/Library/Developer/Xcode/Templates/Project Templates/Application
然后需要两步:
--把Single View Application.xctemplate文件夹名称改为xxx.xctemplate,后缀名必须为xctemplate,这里以Test Template.xctemplate为例。
--打开Test Template.xctemplate中的TemplateInfo.plist文件,将键Identifier的值改为com.apple.dt.unit.testTemplateApplication,这个值是模板的唯一标识。
保存更改后,在new project的templates dialog中就可以看到刚刚定义的模板了:

此时Test Template模板与系统的Single View Application模板是一样,要想进行自定义,我们先来分析下Test Template.xctemplate的组成。
--TemplateInfo.plist(必要):所有的模板属性设置都在这里。
--TemplateIcon.tiff(可选):定义显示在new project的dialog中的模板图标。
-- Main_iPhone.storyboard、Main_iPad.storyboard:要添加在项目中的文件。
所以这里我们把NSLogger的库文件放到Test Template.xctemplate下:

此时新建Test Template项目,肯定是不会自动添加上NSLogger文件的,看来还需要在TemplateInfo.plist中设置一番。
打开TemplateInfo.plist,先来分析一下各个键值的意义:

Ancestors:要继承的模板。也就是模板的“父类”,从父类那里继承一些模板的基础属性,可以有多个父类。
Concrete:设置为YES的模板才可以显示在new project的dialog中,此时这个模板不能被其他模板继承。
Definitions:将Nodes中定义的文件添加到项目中(还有其他功能,这里暂且不表)。
Description:就是Description。
Identifier:刚才已经接触过,模板的唯一标示符,若模板B要继承模板A,就在模板B的Ancestors中写上模板A的Identifier。
Kind:项目模板为Xcode.Xcode3.ProjectTemplateUnitKind,文件模板为Xcode.IDEKit.TextSubstitutionFileTemplateKind。
Nodes:定义要添加到项目中的文件(还有其他功能,这里暂且不表)。
Options:定义在new project中选择模板后点击next后的dialog中的内容,如Product Name、Organization Name、Company Identifier、Bundle Identifier等。
SortOrder:该模板显示在new project的dialog中的位置索引。
更详细的解释会在后面给出链接。
回头看下我们的需求:在新建项目中自动加入LoggerClient.h,LoggerClient.m ,LoggerCommon.h以及一些Frameworks。那么首先编辑的键值就是Nodes、Definitions。
Nodes编辑如下:

Definitions编辑如下:

需要注意的是这里LoggerClient.h,LoggerClient.m ,LoggerCommon.h三个文件都是放在NSLogger文件夹下的。
保存plist修改,此时新建Test Template项目,可以看到已经自动添加上了NSLogger类了。
还有一步工作,需要在项目中添加上NSLogger库要求的Frameworks。很简单,在plist中加入一个key ——Targets。

保存plist后,新建Test Template项目,完工。附上TemplateInfo.plist以供参考。

最后附上参考资料:http://www.learn-cocos2d.com/store/xcode4-template-documentation/里面详细的介绍文件模板和项目模板(Xcode4的方法适用与xcode5),以及TemplateInfo.plist中各个键值的意义。感谢这篇文章的作者。
xcode5 自定义模板的更多相关文章
- Django自定义模板
定义simple_tag步骤 一.创建templatetags文件 首先在app下创建templatetags文件:名字不许叫这个,不能改变. 二.在文件中创建一个py文件 文件名自定义 三.在创建的 ...
- 学习CodeIgniter框架之旅(一)自定义模板目录
在常用的框架本身都已经做好了分层和目录结构,但这在很多时候不满足项目的需求甚至在某些情况下变得不合理,因此很多时候需要自定义目录结构,在此就看看如果在CodeIgniter框架中自定义模板目录: 在C ...
- .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(三)
阅读目录: 7.HtmlHelper.HtmlHelper<T>中的ViewModel的类型推断 8.控制ViewModel中的某个属性的呈现(使用PartialView部分视图细粒度控制 ...
- 使用requireJS,backboneJS,和underscoreJS完成自定义模板封装
使用requireJS,backboneJS,和underscoreJS完成自定义模板封装 原来的代码 当我们进行一个列表的数据填充的时候,是这样做的: //获取美食列表 function getFo ...
- DISCUZ 自定义模板
DISCUZ 自定义模板 模板安装和维护 安装新模板 将模板template打包放在对应目录:template/ 后台 -> 界面 -> 风格管理 , 安装模板 后台 -> 界面 - ...
- 谈谈yii2-gii如何自定义模板
作者:白狼 出处:http://www.manks.top/article/yii2_gii_custom_template本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位 ...
- SharePoint 2013 自定义模板页后在列表里修改不了视图
前言 最近系统从2010升级至2013,有自定义模板页.突然发现在列表中切换不了视图,让我很费解. 我尝试过以下解决方案: 去掉自定义css 去掉自定义js 禁用所有自定义功能 结果都没有效还是一样的 ...
- WPF Step By Step 自定义模板
WPF Step By Step 自定义模板 回顾 上一篇,我们简单介绍了几个基本的控件,本节我们将讲解每个控件的样式的自定义和数据模板的自定义,我们会结合项目中的具体的要求和场景来分析,给出我们实现 ...
- SublimeText插件Emmet的自定义模板
在前端界,作为快速生成代码的Emmet插件相当给力.最近在学bootstrap,需要频繁生成html头文件,我就想着自定义模板.国内只有基础教程,只好自己读英文文档了. Emmet国内基础教程地址: ...
随机推荐
- Selenium webdriver 操作chrome 浏览器
Step1: 下载chromedriver. 下载路径: http://chromedriver.storage.googleapis.com/index.html 选择一个合适的下载即可.我下载的是 ...
- VGO新闻 - VGO
VGO新闻 - VGO VGO天津伊势丹店盛装揭幕 VGO天津伊势丹店盛装揭幕2013年9月7日,VGO(微高)全国首家实体店在天津伊势丹百货盛装开幕.现场,100多位商场领导及业内同仁共同出席了
- 安装完sql server 后修改计算机名后不能进行发布的订阅的解决办法
由于需要需要配置一个发布订阅,可是一直报告:" sql server 复制需要有实际的服务器名称才能连接到服务器,不支持通过别名.ip地址或其他任何备用名称进行连接.请指定实际的服务器名称“ ...
- 4th day
老师讲的好快啊... /* 建一个innodb类型且字符集为utf8的表,其中包括以下类型的字段:int(自增长),float,char,varchar,datetime,date,text,enum ...
- TF卡格式化8G格式化时候变成128KB的解决办法
我的8GC6卡,APPS2SD后,因为不满意分区容量,所以就想删除分区重新分配容量. 删除分区方法:我的电脑---管理---磁盘管理--里删除了EXT3分区, 结果导致TF卡变成FAT格式且没有容量. ...
- Qt深入:不能不知道的Type、Attribute和Flags
Qter高手与新手的区别在于:知道还是不知道 Qt不是开发语言,所以无所谓谁厉害.但使用他的Qter却有着差异,也许是面向对象语言本身的.或者实际经验上的.而对于Qt本身来说,高手与新手最显著的差异在 ...
- LeanCloud使用入门(android)
LeanCloud算是一个简单易用的云服务器,其中包含了强大的数据库支持,我们只需要将此服务器应用到本地的代码即可实现后台的存储与交互. 那么,如何简单实现本地代码和LeanCloud服务器的交互呢? ...
- ZOJ 3822 Domination(概率dp)
一个n行m列的棋盘,每天可以放一个棋子,问要使得棋盘的每行每列都至少有一个棋子 需要的放棋子天数的期望. dp[i][j][k]表示用了k天棋子共能占领棋盘的i行j列的概率. 他的放置策略是,每放一次 ...
- Python之路,Day4 - Python基础4 (new版)
Python之路,Day4 - Python基础4 (new版) 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ...
- noip 2012 国王游戏(贪心+高精)
/* 我是不会说我考试的时候想到了正解却把金币取大看成金币求和的.... 觉得只按左右手乘积排序不太对 有反例 也可能我反例放到这个题里是错的吧 按自己的理解排的序 就是各种讨论... 假设 第i个人 ...