Goo:基于MVVM的IOS实现(下)

作者: 红胡子刚子 | 来源:发表于2016-03-10 10:50 被阅读213次

    Goo是基于MVVM模式进行IOS开发的一个美妙的粘合剂,实现View中元素属性与ViewModel中数据的对接。

    转换器

    使用场景:比如在APP中,我们在设计消息的时候,用0代表未读,1代表已读,这个时候我们希望UI展示时用图片显示已读和未读的状态,这个在Goo中我们需要借助转换器来实现。

    所谓的转换器就是通过一个条件或者一个类型,转换成另外一种结果或者类型,主要实现了IValueConverter接口,下面我们通过一个简单例子来说明。

    首先我们来定义一个转换器
    @interface TextConverter : NSObject<ValueConverter>
    - (id) convert:(id)valueObject;
    @end
    
    #import "TextConverter.h"
    @implementation TextConverter
    - (id) convert:(id)valueObject{
        NSString *s = (NSString *)valueObject;
        s= [NSString stringWithFormat:@"label:%@",s ];
        return s;
    }
    
    使用这个转换器
    [self.inputText bindingWithProperty:@"text" withObject:_vm withDataSource:@"text" withBindingMode:TwoWay];
    TextConverter *textConvert = [[TextConverter alloc]init];
    [self.hineLbl bindingWithProperty:@"text" withObject:_vm withDataSource:@"text" withBindingMode:OneWay withConverter:textConvert];
    
    实现效果

    inputText和hineLbl的text属性都绑定到VM的text上,这样通过转换器hineLbl显示内容为:在inputText的输入内容前增加label:

    转换器包含Convert和ConvertBack两个函数
    1. Convert函数表示从ViewModel的属性到UI元素属性值的转换。
    2. ConvertBack函数表示从UI元素属性值到ViewModel的属性的值转换。因此,如果绑定模式是一次绑定或单向绑定,只需实现Convert函数;如果绑定模式是双向绑定,需要实现Convert和ConvertBack函数。

    具体和控件绑定的方式参见上面的代码

    触发器

    触发器用于监视ViewModel的某一个属性值或者一组属性值发生变化后,程序要进行相应的逻辑处理。

    使用场景

    常见的设计用户登录界面时,初期登录按钮不可用。一旦输入用户名和密码后登录按钮变为可用状态等等,类似的场景在具体开发中非常普遍。
    在Goo中按照数据驱动的原则,触发器是ViewModel的绑定方法通过Block进行回调。

    具体方式参照如下代码
    NSMutableArray *conditions = [[NSMutableArray alloc]init];
    [conditions addObject:@"text"];
    [conditions addObject:@"backgroundColor"];
    [_vm bindingTriggerWithCondition:conditions withDoWithBlock:^{
        if([_vm.text isEqualToString:@"456"]&& _vm.backgroundColor ==[UIColor redColor]){
            NSLog(@"sdf");
        }
    }];
    

    如果ViewModel的text属性等于“456”,backgroundColor等于红色时即触发去做某种处理。

    目前Goo的版本仅仅是对MVVM实现的一个基本尝试,后续会继续维护直到比较成熟后会在Github做第一个版本的发布。

    相关文章

      网友评论

      本文标题:Goo:基于MVVM的IOS实现(下)

      本文链接:https://www.haomeiwen.com/subject/pyjtlttx.html