MVVM与模板化开发

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值