今天在写关于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. ASP.NET Core 性能对比评测(ASP.NET,Python,Java,NodeJS)

    前言 性能是我们日常生活中经常接触到的一个词语,更好的性能意味着能给我们带来更好的用户体检.比如我们在购买手机.显卡.CPU等的时候,可能会更加的关注于这样指标,所以本篇就来做一个性能评测. 性能也一 ...

  2. Leetcode 笔记 98 - Validate Binary Search Tree

    题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...

  3. 跟我一起数据挖掘(23)——C4.5

    C4.5简介 C4.5是一系列用在机器学习和数据挖掘的分类问题中的算法.它的目标是监督学习:给定一个数据集,其中的每一个元组都能用一组属性值来描述,每一个元组属于一个互斥的类别中的某一类.C4.5的目 ...

  4. 《Entity Framework 6 Recipes》中文翻译系列 目录篇 -持续更新

    为了方便大家的阅读和学习,也是响应网友的建议,在这里为这个系列做一个目录.在目录开始这前,我先来回答之前遇到的几个问题. 1.为什么要学习EF? 这个问题很简单,项目需要.这不像学校,没人强迫你学习! ...

  5. 提高(Android)开发效率的工具与网站

    Dev_Tools 写这篇不是为了"水",是因为有些工具确实不错,但是换个电脑要找到或者在某个时候你想用但是你只知道存在了书签里.然后就只能下载chrome然后登录账户同步书签了. ...

  6. 你所不知道的setTimeout

    JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务.初始接触它的人都觉得好简单 ...

  7. [转]安装 SciTE 报错 No package ‘gtk+-2.0′ found

    centos 记事本,有时候感觉不够用,或者 出毛病,打不开文件 然后决定安装个其他的记事本,  找来找去, 感觉 SciTE 还可以,于是下载源码编译安装,结果 No package ‘gtk+-2 ...

  8. zookeeper集群搭建

    1.由于是第一次搭建zk的集群,过程中遇到些问题,给自己也给遇到问题的人提供一种可能解决问题的方法. 第一步:下载zk的最新版,我下的是3.4.9,在zk的官网,下载后解压到/usr/local ta ...

  9. 【.net深呼吸】非 Web 项目使用缓存

    从.net 4 开始,非web项目也可以使用缓存技术,故曰:.net 4 乃框架成熟之标志也. 对于缓存嘛,耍过 ASP.NET 的伙伴们肯定知道,这么说吧,就是将一些使用频率较高的数据放于内存中,并 ...

  10. ListView中item定位

    ListView 实现定位特定 item 最近在项目中需要使 ListView 能跳转到特定的 item,查阅文档后,发现 ListView 有以下几种方法可供使用: smoothScrollToPo ...