本文不对MVVM划分做过多解释,只做模板化的讨论。
当完成MVVM后。项目中增加了很多ViewModel 的文件
比如TableViewModel ViewControllerViewModel CellViewModel
为了统一管理,每个都有自己的基类,导致项目中分很多文件夹,每个然后每次创建一个控制器的时候
都需要创建多个文件 一不小心就会写错命名 一不小心就会忘记了要继承 非常费力
我是这样完成这部分功能的
1.首先分别给每个需要处理的部分创建.h 和.m的文件模板,
这个功能块是不复杂的,只要搜索 Xcode 自定义模板 就可以解决了
做完这个功能块,发现了很多问题,因为很多viewModel 相互之间和控制器里面是有import关系的,每个ViewModel 命名都不一样
所以是不能写死的,写死了就不存在这个类,不写死又会报错。
所以我就想在 一个自定义模板里面放多个文件,然后改其后缀名
这样就可以相互之间引用了。
就是把控制器 viewModel cell、等等都放到一个模板生成里面。
2.试了一下,确实能够成功,在我以为大功告成的时候,发现一个问题 ,就是___FILEBASENAMEASIDENTIFIER___
并不是你输入的那个名字,而是你.h 或者.m的名字, 这样引用其他文件就造成了很大的问题
比如你新建一个模板 ,命名为ABC
那么会生成 ABC_ViewController,ABC_ViewControllerViewModel
ABC_TableCell, ABC_Model,这四个.h 和.m的文件
ABC_ViewControllerViewModel 需要引入ABC_TableCell 和ABC_Model 的头文件
于是我在模板中这样写 import "___FILEBASENAMEASIDENTIFIER___TableCell.h"
和 import "___FILEBASENAMEASIDENTIFIER___Model,.h"
并信心满满的认为会引入ABC_TableCell 和ABC_Model 正确的头文件
实际上 引入的头文件名称被变为 ABC_ViewControllerViewModelModel
和ABC_ViewControllerViewModelTableCell
多出了ViewControllerViewModel
是因为这个参数 是和文件名保持一致的而不是和你本身输入的ABC保持一致的、
这样下来是不是没有办法了呢。我找了一下午 找到一篇有可能的解决方案
原来plist 很多参数都是有意义都可以修改的
拉到最下面 有这样一段代码
#import "User.h"
@interface UserTest : GHTestCase
@end
@implementation UserTest
- (void)setUp {
}
- (void)tearDown {
}
- (void)testMethod {
// Implement test case
}
@end
说明这段代码成功的引用了User 并没有和GHTestCase关联在一起
他的结尾提供了文件模板,找到他的plist 看一下
<array>
<dict>
<key>Default</key>
<string/>
<key>Description</key>
<string>What would you like to test?</string>
<key>Identifier</key>
<string>cutClass</string>
<key>Name</key>
<string>Test case for</string>
<key>Required</key>
<true/>
<key>NotPersisted</key>
<true/>
<key>Type</key>
<string>text</string>
</dict>
<dict>
<key>Default</key>
<string>___VARIABLE_cutClass:identifier___Test</string>
<key>Identifier</key>
<string>productName</string>
<key>Type</key>
<string>static</string>
</dict>
</array>
这是一段xml 我来解释一下这段是什么意思
数组包含两个字典
第一个字典 是可以输入的 就是用户输入的 因为类型为Text
然后把第一个字典的 Identifier 设置成为 cutClass
第二个字典是做什么的呢 他的内容不是用户输入的 是 static 静态的
内容为___VARIABLE_cutClass:identifier___Test 什么意思呢
就是 找到字典 identifier 为cutClass 的变量数值 后面在拼接Test 作为新的identier
就是说第二个字典这个___VARIABLE_cutClass:identifier___Test
就可以获取到用户输入的名称了
于是我就参照这个进行仿写xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Identifier</key>
<string>productName</string>
<key>Required</key>
<true/>
<key>Name</key>
<string>The name of the class to create:</string>
<key>Description</key>
<string>The name of the class to create</string>
<key>Type</key>
<string>text</string>
<key>NotPersisted</key>
<true/>
</dict>
<dict>
<key>Default</key>
<string>___VARIABLE_productName:identifier___</string>
<key>Identifier</key>
<string>cutClass</string>
<key>Type</key>
<string>static</string>
</dict>
</plist>
这样就可以捕获用户输入的内容了
然后把 `import "___FILEBASENAMEASIDENTIFIER___TableCell.h"
改成 #import "___VARIABLE_cutClass:identifier___TableCell.h"
这下生成就不会出错了
就可以直接使用了。
通过这次对文件模板的使用
意识到文件模板本身是非常强大的,可以写单例,也可以用来提供MVVM的文件结构代码,极大的减少了重复代码创建的时间。甚至可以用来建立新的项目
建立新项目的时候很多代码是完全一样的,就可以用文件模板来建立
还有许多其他的功能等待开发。
难点是集中在 plist 文件上,如果我没找到上面的文章例子,这次的文件模板化就不完整了。因此对plist 的关键字的理解,才是用好文件模板的关键。