今天在写关于textView的数据绑定时原先写法是这样的:

1、 RACChannelTo(self,textView.text) = RACChannelTo(self,model.text);

2、 我在运行的时候看到log并未发现我的model.text随着键盘输入的内容改变而发生变化。但是我点击button时用代码修改model.text的值时代码改变的值却能同步到textView上面,后来在stackoverflow上看到一个相似的issue,https://github.com/ReactiveCocoa/ReactiveCocoa/issues/1473,这个问题的描述是这样的 (

They're not the same.

self.valueTextField.rac_newTextChannel    sends values when you type in the text field, but not when you change the text in the text field from code.

RACChannelTo(self.uiTextField, text) sends values when you change the text in the text field from code, but not when you type in the text field.

RACChannelTo(self.valueTextField, text)= RACChannelTo(self.viewModel, value); (其实官方文档是这么说的:UIKit classes don't expose KVO-compliant properties UIKIt里面的很多控件本身不支持KVO,而ReactiveCocoa本身是基于KVO实现的,所以就会出现这种双向绑定不成功的现象,这时候就需要我们手动用信号,或者是rac提供的其他属性来做处理完成双向绑定的操作)

也就是说当使用键盘手动输入时你的以为有效写法: RACChannelTo(self,textView.text) = RACChannelTo(self,model.text);其实是无效的

于是乎提问者采用了另外一种方式:

RACChannelTerminal *channelTerminal = self.valueTextField.rac_newTextChannel;

RACChannelTerminal *channelTerminal2 = RACChannelTo(self.viewModel, value);

//@interface RACChannelTerminal : RACSignal <RACSubscriber>

[channelTerminal subscribe:channelTerminal2];

[channelTerminal2 subscribe:channelTerminal];

[RACObserve(self.viewModel, value) subscribeNext:^(id x) {

    NSLog(@"x = %@", x);
}]; 对于此问题的关键是代码改变值和键盘输入的信号是不一致的。(我只能这么说了)
由于使用代码对model到view这个方向的绑定是没问题的,所以我们只要在textView的text改变的信号中做一个手动的设置值(在subscribeNext中主动设置model对应的属性值就可以完成双向绑定了) 解决:在signal的subscribeNext的block中进行一次赋值 代码如下:

#import "ViewController.h"

#import <ReactiveCocoa/ReactiveCocoa.h>

@interface Model : NSObject

@property (nonatomic, strong) NSString *text;

@end

@implementation Model

@end

@interface ViewController ()

@property (nonatomic, strong) UITextView *textView;

@property (nonatomic, strong) Model *model;

@property (nonatomic, copy) NSString *str;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

self.textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 80, CGRectGetWidth(self.view.bounds), 300)];

self.textView.backgroundColor = [UIColor redColor];

[self.view addSubview:self.textView];

self.model = [Model new];

//1、(监听model的变化将变化映射到textView)这种写法其实已经是双向绑定的写法了,但是由于是textView的原因只能绑定model.text的变化到影响textView.text的值的变化的这个单向通道

RACChannelTo(self,textView.text) = RACChannelTo(self,model.text);

//2、(监听View的变化将view的内容映射到model中)在这里对textView的text changed的信号重新订阅一下,以实现上面channel未实现的另外一个绑定通道.

@weakify(self)

[self.textView.rac_textSignal subscribeNext:^(id x) {

@strongify(self)

self.model.text = x;

NSLog(@"model text is%@",self.model.text);

}];

UIButton *resetBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 480, 60, 40)];

resetBtn.backgroundColor = [UIColor yellowColor];

[resetBtn setTitle:@"reset" forState:UIControlStateNormal];

[self.view addSubview:resetBtn];

resetBtn.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {

@strongify(self)

RACSignal *signal = [RACSignal return:input];

[signal subscribeNext:^(id x) {

self.model.text = @"reset yet";

NSLog(@"model text is%@",self.model.text);

}];

return signal;

}];

}

@end



RAC textView的双向绑定的更多相关文章

  1. 数据的双向绑定 Angular JS

    接触AngularJS许了,时常问自己一些问题,如果是我实现它,会在哪些方面选择跟它相同的道路,哪些方面不同.为此,记录了一些思考,给自己回顾,也供他人参考. 初步大致有以下几个方面: 数据双向绑定 ...

  2. vue.js初级入门之最基础的双向绑定操作

    首先在页面引入vue.js以及其他需要用到的或者可能要用到的插件(这里我多引用了bootstrap和jquery) 引用的时候需要注意文件的路径,准备工作这样基本就完成了,下面正式开始入门. vue. ...

  3. AnjularJS系列3 —— 数据的双向绑定

    第三篇,双向的数据绑定 数据绑定是AnguarJS的特性之一,避免书写大量的初始代码从而节约开发时间 数据绑定指令提供了你的Model投射到view的方法.这些投射可以无缝的,毫不影响的应用到web应 ...

  4. 前端MVVM框架avalon揭秘 - 双向绑定原理

    avalon大家可能不熟悉,但是Knockout估计或多或少听过用过,那么说说KO的几个概念 监控属性(Observables)和依赖跟踪(Dependency tracking) 声明式绑定(Dec ...

  5. 我的angularjs源码学习之旅3——脏检测与数据双向绑定

    前言 为了后面描述方便,我们将保存模块的对象modules叫做模块缓存.我们跟踪的例子如下 <div ng-app="myApp" ng-controller='myCtrl ...

  6. Angularjs 双向绑定机制解析

    文章转自:http://www.2cto.com/kf/201408/327594.html AngularJs 的元素与模型双向绑定依赖于循环检测它们之间的值,这种做法叫做脏检测,这几天研究了一下其 ...

  7. way.js - 轻量级、持久化的双向绑定JS库

    AngularJS的双向绑定一直为人称道,但使用AngularJS需要对页面组件化,学习成本还是很高的. 本文源自 https://github.com/gwendall/way.js 边学边译. 使 ...

  8. React的双向绑定

    以前对于双向绑定概念来自于Angular.js,现在我用我感兴趣的react.js来实现这样的方式.有2种方式分析,1:不用插件,2:用插件 (引入react.js操作省略...) 不用插件: 先创建 ...

  9. Vue.js双向绑定的实现原理

    Vue.js最核心的功能有两个,一是响应式的数据绑定系统,二是组件系统.本文仅探究几乎所有Vue的开篇介绍都会提到的hello world双向绑定是怎样实现的.先讲涉及的知识点,再参考源码,用尽可能少 ...

随机推荐

  1. mono for android学习过程系列教程(2)

    接着上一讲继续开始写,今天介绍的是安卓的基本组成结构. 在大多数情况下,MONO FOR ANDROID的命名空间和Android的命名空间 是互相映射的.有时候需要大小写,非字母数字字符的用法以及名 ...

  2. ReactNative入门 —— 动画篇(上)

    在不使用任何RN动画相关API的时候,我们会想到一种非常粗暴的方式来实现我们希望的动画效果——通过修改state来不断得改变视图上的样式. 我们来个简单的示例: var AwesomeProject ...

  3. Git入门资料汇总

    Git是一个非常好用的版本控制工具,同时,它也是一个相对比较复杂的工具,想要掌握它还是需要花一番功夫的.网络上关于Git的入门资料已经很多了,我就不再重复了,直接把我学习的文章放在这里. Git详解 ...

  4. MapReduce剖析笔记之四:TaskTracker通过心跳机制获取任务的流程

    上一节分析到了JobTracker把作业从队列里取出来并进行了初始化,所谓的初始化,主要是获取了Map.Reduce任务的数量,并统计了哪些DataNode所在的服务器可以处理哪些Split等等,将这 ...

  5. [转] STM32各种时钟的区别

    [原创]:http://m.oschina.net/blog/129357 我在原创的基础又从另一位博主处引用了一些内容. 时钟系统是处理器的核心,所以在学习STM32所有外设之前,认真学习时钟系统是 ...

  6. jQuery 根据值或者文本选中select

    今天因为有项目需要动态操作select选中 习惯在百度上搜了一下 ,结果还是挺多的.试了其中一个 发现不能使用.打开第2,3 个发现都是一样的然后自己稍微研究了一下 //初始化select,第一个选中 ...

  7. MySQL基础笔记

    一.登录参数 -D 打开指定数据库 -h 服务器名称 -p 密码 -P 端口 -u 用户名 -V 输出版本信息并退出 --prompt 提示符 mysql> ,或者登陆后 用prompt命令 提 ...

  8. T-SQL检查停止的复制作业代理,并启动

        有时候搭建的复制在作业比较多的时候,会因为某些情况导致代理停止或出错,如果分发代理时间停止稍微过长可能导致复制延期,从而需要从新初始化复制,带来问题.因此我写了一个脚本定期检查处于停止状态的分 ...

  9. php中会话保持 session 与cooker

    会话保持 1.session Session:在计算机中,尤其是在网络应用中,称为"会话控制".Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的 ...

  10. 跨域之jsonp

    我们都知道使用<script>标签可以引入外部的JS文件,即使这个JS文件来自于其他的网站,比如我们引用存放在网络服务器上的jQuery框架.在这个过程中,我们已经实现跨域访问.像< ...