MVVM与模板化开发

来源:互联网 发布:qq飞车noble激光数据 编辑:程序博客网 时间:2024/05/22 10:35

本文不对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_ViewControllerViewModelModelABC_ViewControllerViewModelTableCell 多出了ViewControllerViewModel 是因为这个参数 是和文件名保持一致的而不是和你本身输入的ABC保持一致的、

这样下来是不是没有办法了呢。我找了一下午 找到一篇有可能的解决方案

创建自定义Xcode 4文件模板

原来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 的关键字的理解,才是用好文件模板的关键。