RAC textView的双向绑定
今天在写关于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的双向绑定的更多相关文章
- 数据的双向绑定 Angular JS
接触AngularJS许了,时常问自己一些问题,如果是我实现它,会在哪些方面选择跟它相同的道路,哪些方面不同.为此,记录了一些思考,给自己回顾,也供他人参考. 初步大致有以下几个方面: 数据双向绑定 ...
- vue.js初级入门之最基础的双向绑定操作
首先在页面引入vue.js以及其他需要用到的或者可能要用到的插件(这里我多引用了bootstrap和jquery) 引用的时候需要注意文件的路径,准备工作这样基本就完成了,下面正式开始入门. vue. ...
- AnjularJS系列3 —— 数据的双向绑定
第三篇,双向的数据绑定 数据绑定是AnguarJS的特性之一,避免书写大量的初始代码从而节约开发时间 数据绑定指令提供了你的Model投射到view的方法.这些投射可以无缝的,毫不影响的应用到web应 ...
- 前端MVVM框架avalon揭秘 - 双向绑定原理
avalon大家可能不熟悉,但是Knockout估计或多或少听过用过,那么说说KO的几个概念 监控属性(Observables)和依赖跟踪(Dependency tracking) 声明式绑定(Dec ...
- 我的angularjs源码学习之旅3——脏检测与数据双向绑定
前言 为了后面描述方便,我们将保存模块的对象modules叫做模块缓存.我们跟踪的例子如下 <div ng-app="myApp" ng-controller='myCtrl ...
- Angularjs 双向绑定机制解析
文章转自:http://www.2cto.com/kf/201408/327594.html AngularJs 的元素与模型双向绑定依赖于循环检测它们之间的值,这种做法叫做脏检测,这几天研究了一下其 ...
- way.js - 轻量级、持久化的双向绑定JS库
AngularJS的双向绑定一直为人称道,但使用AngularJS需要对页面组件化,学习成本还是很高的. 本文源自 https://github.com/gwendall/way.js 边学边译. 使 ...
- React的双向绑定
以前对于双向绑定概念来自于Angular.js,现在我用我感兴趣的react.js来实现这样的方式.有2种方式分析,1:不用插件,2:用插件 (引入react.js操作省略...) 不用插件: 先创建 ...
- Vue.js双向绑定的实现原理
Vue.js最核心的功能有两个,一是响应式的数据绑定系统,二是组件系统.本文仅探究几乎所有Vue的开篇介绍都会提到的hello world双向绑定是怎样实现的.先讲涉及的知识点,再参考源码,用尽可能少 ...
随机推荐
- eclipse,myeclipse 误删文件,回滚历史文件操作
昨天因为误操作把一个写了一上午的代码给删了,找到的这个,以前竟然还没发现有这个功能- -! 具体操作: 1.建立同路径同名的文件 2.文件上右键 --> Compare With --> ...
- python 常用第三方模块
除了内建的模块外,Python还有大量的第三方模块. 基本上,所有的第三方模块都会在https://pypi.python.org/pypi上注册,只要找到对应的模块名字,即可用pip安装. 本章介绍 ...
- 整理Ajax的点点滴滴
最近看了下<Javascript高级程序设计>(第三版)关于Ajax部分,做了这篇笔记. 一.常规用法 第一步,创建XHR对象var xhr = new XMLHttpRequest(); ...
- Linux环境下shell和vim中乱码原因及消除办法
shell和vim中乱码原因及消除办法 作者:Jack47 在Linux下开发,经常遇到乱码问题:shell或者vim中显示不了中文,或者能够显示,但不能输入中文.每次都是上网去搜,或者同事告诉我一些 ...
- ABP源码分析三十六:ABP.Web.Api
这里的内容和ABP 动态webapi没有关系.除了动态webapi,ABP必然是支持使用传统的webApi.ABP.Web.Api模块中实现了一些同意的基础功能,以方便我们创建和使用asp.net w ...
- 菜鸟学Struts2——HelloWorld
写在前面 自从工作后就过上了只有一个月记忆的生活,太健忘,很多学过的东西因为用得少便忘记了,第二次学习struts,为了以后便于查阅,开始自己的博客之旅.Struts的学习还是从Hello World ...
- maven archetype二三事
maven plugin 创建maven archetype 骨架的plugin是 <plugin> <groupId>org.apache.maven.plugins< ...
- 解析大型.NET ERP系统 数据审计功能
数据审计,英语表达是Audit,是追踪数据变化的过程,记录数据变化前后的值,供参考分析.通过设置,ERP可以追踪一个表的所有字段的变化,也可以只记录指定的字段的值变化.欧美企业每年都有独立的审计部门, ...
- Python下载网页的几种方法
get和post方式总结 get方式:以URL字串本身传递数据参数,在服务器端可以从'QUERY_STRING'这个变量中直接读取,效率较高,但缺乏安全性,也无法来处理复杂的数据(只能是字符串,比如在 ...
- Parallel并行之乱用
关于Parallel我也不细说了,一则微软封装的很好用,二来介绍这个的遍地都是. 我要说的是,要想成为一个优秀的标题党,一定要把重点放到别的地方,为了节省大家阅读时间,我先把结论说了,然后再慢慢从头说 ...