Xcode Tips 006:自定义 Xcode 模板

2020-06-28 17:55:10 浏览数 (1)

Xcode 模板是用来创建代码片段的工具。当你的工程中有很多可以标准化的代码时,比如 MVVM 架构中的各个组件,使用模板可以快速帮你生成代码,避免手动去新建 MVVM 每个组件的文件,然后再手动敲每个组件的通用代码。而且模板可以集成进 Xcode 的 新建文件 面板中,以我们熟悉的方式来创建。实际上面板中的项目都是现成的模板。

Xcode 所有的自定义的模板文件都放在 ~/Library/Developer/Xcode/Templates/ 中,可以按自己的需要在这个目录中创建一些子文件夹,这些子目录会以分组的形式出现在 新建文件 面板中,每个子文件夹可以定义多个模板。我们在这创建一个 Custom Templates 子目录。

每个 Xcode 文件模板都是以 .xctemplate 为扩展名的独立的文件夹。我们可以创建一个 MVVM.xctemplate 文件夹。然后在文件夹中新建一个 TemplateInfo.plist 文件来描述模板。这是个 XML 文件,如下所示:

代码语言:javascript复制
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Kind</key>
    <string>Xcode.IDEKit.TextSubstitutionFileTemplateKind</string>
    <key>Platforms</key>
    <array>
        <string>com.apple.platform.iphoneos</string>
    </array>
    <key>Options</key>
    <array>
        <dict>
            <key>Identifier</key>
            <string>productName</string>
            <key>Required</key>
            <true/>
            <key>Name</key>
<string>Module Name</string>
            <key>Description</key>
            <string>MVVM</string>
            <key>Type</key>
            <string>text</string>
            <key>Default</key>
            <string>MVVM Template</string>
        </dict>
    </array>
</dict>
</plist>

在这个配置文件中,需要注意一个值 Identifier,即创建文件时输入的一个标识,我们会在后续的文件或文件夹中,以 __VARIABLE_productName__ 作为变量值来替换所有引用到这个值的地方,包括文件夹名称、文件名称、和文件中的类名和变量名等。

实际上这时我们就可以在新建文件面板中看到一个 Icon 了。 不过我们还需要补全代码。

我们简单地以 视图控制器ViewModel 为例。我们在 MVVM.xctemplate 下添加一个文件夹,命名为 __VARIABLE_productName__,同时在这个子文件夹下分别新建文件 __VARIABLE_productName__ViewController.swift__VARIABLE_productName__ViewModel.swift,内容分别如下:

代码语言:javascript复制
// __VARIABLE_productName__ViewController.swift

import UIKit

class ___VARIABLE_productName___Controller: UIViewController {
    
    let viewModel: ___VARIABLE_productName___ViewModel
    let mainView: ___VARIABLE_productName___View
    
    init() {
        viewModel = ___VARIABLE_productName___ViewModel(withModel: ___VARIABLE_productName___())
        mainView = ___VARIABLE_productName___View()
        super.init(nibName: nil, bundle: nil)
        
        mainView.configure(withViewModel: viewModel)
    }
    
    required init?(coder _: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}
代码语言:javascript复制
// __VARIABLE_productName__ViewModel.swift

import UIKit

class ___VARIABLE_productName___ViewModel {
    private let model: __VARIABLE_productName: identifier__

    init(withModel model: __VARIABLE_productName: identifier__) {
        self.model = model
    }
}

这时我们便可以在新建文件面板中通过我们的自定义模板来创建文件了,如下图。

当然这里只是一个简单的示例,还有一些地方需要完善,比如说自定义新建文件面板中的图标,以 Group 的形式新增文件夹等等,读者可以自行探索。

0 人点赞