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双向绑定是怎样实现的.先讲涉及的知识点,再参考源码,用尽可能少 ...
随机推荐
- SQL Server2014 SP2关键特性
SQL Server2014 SP2关键特性 转载自:https://blogs.msdn.microsoft.com/sqlreleaseservices/sql-2014-service-pack ...
- 为支持ASP.NET5跨平台,Jexus再添新举措
Jexus作为一款运行于Linux/FreeBSD平台上,以支持ASP.NET著称的高性能HTTP服务器和反向代理服务器,继5.6版完成对OWIN标准应用的支持后,就把着力点放到了对ASP.NET5的 ...
- ReactNative入门(安卓)——API(下)
LayoutAnimation - layout动画 当布局发生改变时的动画模块,它有两个方法: 1. 最常用的方法是 LayoutAnimation.configureNext(conf<Ob ...
- Goodbye2014,Hello2015
正如我在研发会议上说的,总结是为了更好的计划:而计划,则是让你做事有目标,有方向:有了目标和方向,你才能真正把事情做成! 总的来说2014年可以归纳为下图: 2014年总结 一年的活动,基本可以归纳为 ...
- Java线程池解析
Java的一大优势是能完成多线程任务,对线程的封装和调度非常好,那么它又是如何实现的呢? jdk的包下和线程相关类的类图. 从上面可以看出Java的线程池主的实现类主要有两个类ThreadPoolEx ...
- Windows 2008 - 由于管理员设置的策略,该磁盘处于脱机状态
http://blog.sina.com.cn/s/blog_59cc90640102x8m4.html 查看原文:https://www.bxl.me/9279.html准备使用云主机挂机的时候呢出 ...
- ABP框架 - 数据传输对象
文档目录 本节内容: DTO 必要性 领域层的抽象 数据隐藏 序列化和延迟加载问题 DTO 约定和验证 示例 DTO和实体间自动映射 使用特性和扩展方法进行映射 辅助接口和类 Data Transfe ...
- 有意思的记录-python
1.变量 类变量紧接在类名后面定义,相当于java和c++的static变量 实例变量在init里定义,相当于java和c++的普通变量 2.日期 #coding:utf-8 import time ...
- js变量声明作用域问题
1.先来看两个题 var a = 1; foo1(); function foo1(){ console.log(a); //输出1 }; foo2(); var a = 1; function fo ...
- nodejs模块中exports和module.exports的区别
通过Node.js的官方API可以看到Node.js本身提供了很多核心模块 http://nodejs.org/api/ ,这些核心模块被编译成二进制文件,可以require('模块名')去获取:核心 ...