效果图
背景
鉴于公司非常注重代码规范,所以需要有良好的代码标注(MARK、FIXME、TODO),有利于代码文件目录清晰。
代码文件内部基本一致的集成风格,比如每个Controller都有必须实现固定方法重写,继承基础Controller等。
解决方法
- 采用赋值粘贴,修改名字
- 创建快捷代码块
- 修改Xcode文件模板,新建选择模板继承,形成统一风格
自定义文件模板
步骤一:找到模板文件
有两种路径方式,各有优缺:
- Xcode模板路径:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates/Source
- 自定义模板路径:
~/Library/Developer/Xcode/Templates/
路径1新建文件是后很方便,可以和 CocoaTouch 一起出现,但是重新安装 Xcode 模板就不见了。路径2重新安装 Xcode 不影响。
打开访达,可以一步一步找到,也可以快捷键command + shift + G 前往。
模板如下图: - 对应的Xcode 新建模板如下:
步骤二: 新建模板
既然都找到模板了,那就可以修改它。但是你仍然需要注意。
- 不影响原本模板,你应该赋值一份基于CocoaTouchClass模板来修改。
- 直接在应用的目录里无法修改,你应该赋值一份出来。
比如,我需要建一份Swift专用的模板,需要如下:
- 基于BaseController继承的带规范性标注的模板
- 自定义View模板
- Model模板
复制模板出来
修改复制出来的模板文件名改为为MySwift,
删除文件内的无关文件,只保留Swift版本的UIViewControllerSwift,UIViewSwift等文件
修改系统模板
修改对应文件。比如原始UIViewSwift文件
//___FILEHEADER___
import UIKit
class ___FILEBASENAMEASIDENTIFIER___: ___VARIABLE_cocoaTouchSubclass___ {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
}
*/
}
修改为自定义模板
//___FILEHEADER___
// <#title#>
// 简述:<#描述#>
import UIKit
class ___FILEBASENAMEASIDENTIFIER___: ___VARIABLE_cocoaTouchSubclass___ {
// MARK: - 属性
// MARK: - 生命周期
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
commonInit()
}
private func commonInit() {
<#初始化操作#>
}
override func layoutSubviews() {
super.layoutSubviews()
}
// MARK: - 辅助方法
}
添加新建模板
除了更改系统模板,也可以新建自定义模板,但是要保留相应的宏定义,比如模板文件___FILEBASENAME___.swift
比如,添加一个Model模板
//___FILEHEADER___
import Foundation
import HandyJSON
@objcMembers
class OrderQRCodeModel: NSObject, HandyJSON {
required override init() {}
}
修改配置文件
由于删除了原有模板,新建个人模板文件,所有需要修改TemplateInfo.plist部分内容,使得避免干扰和可识别新建模板文件。
Option 参数解释
Key | 描述 | 值类型 |
Name | 选项标签显示名字 | String |
Description | 鼠标悬停时的描述 | String |
Type | 改选项的类型,包含:checkbox(单选框),text(输入框), static(静态文字), combo(), popup(下拉选择) | String |
Required | 如果此选项没有值,是否禁用“下一步”按钮 | Bool |
Identifier | 唯一标识,作为其他选项内容变量 | String |
Default | 默认值,可以使用其他选项的变量, | String |
Values | Type 为combo或者popup的值提供 | 字符串数组 |
RequiredOptions | 仅当选择了另一个选项的某些值时,才可用于启用当前选项。例如,仅启用另一个弹出选项的某些值的复选框。字典的键必须是另一个选项的标识符,并且字典的值必须是 | Dictionary |
SortOrder | 控制选项的显示顺序,默认按照 options数组顺序显示。 | Number |
一次生成多个模板文件
通过复制系统自带的代码模板和修改 plist 配置,可以快速定义自己的单文件模板,如果我想一步创建多个文件模板怎么办了?比如说一次性创建 Model, Controller, Request 等模板。
配置如下:
xctemplate.plist 配置大致如下:
{
Kind = "Xcode.IDEFoundation.TextSubstitutionFileTemplateKind";
Platforms = (
"com.apple.platform.iphoneos",
);
Options = (
{
Description = "The name of the module to create";
Identifier = "productName";
Name = "New Module Name:";
Required = YES;
Type = text;
}
);
}
将自定义模板引入Xcode
将修改后的模板放在刚刚路径下Resource,重启 Xcode, 现在在项目中command + n就可以看到自己的模板了。
协同同步脚本
如果涉及到多人协同开发,也可以git远程同步与管理,通过统一脚本同步模板。
更新模板脚本
#!/bin/bash
# 更新模板
# 这里可以同步下远程仓库 git pull
# 获取当前目录路径
current_path=$(cd $(dirname $0); pwd)
echo "当前路径:${current_path}"
new_path="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates/iOS/Source"
file_name='/模板文件名.xctemplate'
echo "模板路径:${new_path}"
raw_dir="${current_path}${file_name}"
new_dir=$new_path
# 复制文件 注意这里需要用双引号,解决路径含有空格问题。
cp -rvf "${raw_dir}" "${new_dir}"
# 结果为0 成功
if [ $? -eq 0 ]; then
echo "更新成功"
else
echo "更新失败"
fi
如何直接执行脚本
将后缀sh
改为.command
,双击脚本即可唤起终端执行。
前提是脚本文件已经是可执行的。如果不是可以用下面命令改变:
chmod +x 脚本路径
扩展
如何定义可以创建包含文件夹(Group)的模板,知道的兄弟告诉我一下,剖析 Uber 的 RIB 架构中 深入 RIBS,他们团队就可以通过模板创建Group 和相关代码文件
参考
先进的 Xcode9 模板文件 详细介绍 option 参数,支持一次创建多个文件模板 github 地址