前言:

上一篇讲ReactiveCocoa是函数响应式编程,并将多种事件响应的方式统一起来,使得不同的事件响应方式高度统一。同时也讲了ReactiveCocoa框架里面常见的几个概念。接下来基于那几个概念来看看UI开发中的几个应用。

实战:

1,替换了UIButton的target-Action:

 [[self.btn rac_signalForControlEvents:(UIControlEventTouchUpInside)] subscribeNext:^(id x) {
NSLog(@"点击了button");
}];

到rac_signalForControlEvents方法里面查看这个方法做的操作:

 - (RACSignal *)rac_signalForControlEvents:(UIControlEvents)controlEvents {
@weakify(self); return [[RACSignal
createSignal:^(id<RACSubscriber> subscriber) {
@strongify(self); [self addTarget:subscriber action:@selector(sendNext:) forControlEvents:controlEvents];
[self.rac_deallocDisposable addDisposable:[RACDisposable disposableWithBlock:^{
[subscriber sendCompleted];
}]]; return [RACDisposable disposableWithBlock:^{
@strongify(self);
[self removeTarget:subscriber action:@selector(sendNext:) forControlEvents:controlEvents];
}];
}]
setNameWithFormat:@"%@ -rac_signalForControlEvents: %lx", RACDescription(self), (unsigned long)controlEvents];
}

可以看到创建了一个RACSignal信号并在block回调的时候执行操作为按钮添加了监听。此方法返回一个RACSignal信号,同时我们在外界调用subscribeNext订阅这个信号,当点击按钮的时候调用sendNext方法发送值出来就回调了subscribeNext的block。

2,绑定textView的监听(使用textfield同样的道理)

   [self.myTextView.rac_textSignal subscribeNext:^(id x) {
NSLog(@"输出:%@",x);
}];

3,绑定手势:

 UITapGestureRecognizer *tap = [UITapGestureRecognizer new];
[self.redView addGestureRecognizer:tap];
[tap.rac_gestureSignal subscribeNext:^(id x) {
NSLog(@"点击了红色的view");
}];

可以感到一些比较平常的UI控件基于 ReactiveCocoa上使用起来还是比较简单的,这里值得说一下的是当UI控件是代理方式来监听响应过程的时候。比如UIImagePicker。下面代码实现一个简单的小功能,点击按钮选择图片,图片选择好了之后显示在UIImageView上面。

4,替换UI控件的代理回调:

 [[self.btn rac_signalForControlEvents:(UIControlEventTouchUpInside)] subscribeNext:^(id x) {

         //点击按钮弹出UIImagePicker
self.imagePicker = [UIImagePickerController new];
[self.imagePicker.rac_imageSelectedSignal subscribeNext:^(id x) {
//该block回调是在照片选择完成的时候调用
NSLog(@"%@",x);
NSDictionary *dic = (NSDictionary *)x;
self.myImageView.image = dic[@"UIImagePickerControllerOriginalImage"];
[self.imagePicker dismissViewControllerAnimated:YES completion:nil];
}];
    //rac_delegateproxy是RAC下的代理属性,这行代码可以理解为,RAC下的代理将会执行block回调替换之前的代理去执行imagePickerControllerDidCancel方法
         [[self.imagePicker.rac_delegateProxy signalForSelector:@selector(imagePickerControllerDidCancel:)] subscribeNext:^(id x) { 
//该block调用时候:当delegate要执行imagePickerControllerDidCancel
[self.imagePicker dismissViewControllerAnimated:YES completion:nil];
}]; [self presentViewController:self.imagePicker animated:YES completion:nil]; }];

5,RAC下的通知:

第一个页面注册通知:

     [[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"ChangeColor" object:nil] subscribeNext:^(id x) {
NSNotification *notification = (NSNotification *)x;
NSLog(@"收到通知:%@",notification.object);
self.view.backgroundColor = (UIColor *)notification.object;
}];

第二个页面中返回按钮发送通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"ChangeColor" object:[UIColor grayColor]];

6,RAC下的观察者设计模式:

currentValue是视图控制器拥有的一个Int类型的属性.观察该属性的变化

[[self rac_valuesAndChangesForKeyPath:@"currentValue" options:(NSKeyValueObservingOptionNew) observer:self] subscribeNext:^(id x) {
//解包元组,会把元组里面的值按顺序给变量赋值
RACTupleUnpack(NSString *kind,NSString *new) = x;
NSLog(@"观察到currentValue的值发生改变,现在的value等于%@,%@",kind,new); }];

按钮点击改变currentValue的值

[[self.valueButton rac_signalForControlEvents:(UIControlEventTouchUpInside)] subscribeNext:^(id x) {
self.currentValue ++;
}];

源代码地址:https://github.com/SZT0728/ReactiveCocoaProgram

可以看到RAC下的UI高度统一了多种事件响应成block回调的方式。文章不精髓,只希望能够记下自己学习的点滴并以最简单的形式分享出来。若有不当之处,请指出。

ReactiveCocoa之UI篇的更多相关文章

  1. 最快让你上手ReactiveCocoa之进阶篇

    前言 由于时间的问题,暂且只更新这么多了,后续还会持续更新本文<最快让你上手ReactiveCocoa之进阶篇>,目前只是简短的介绍了些RAC核心的一些方法,后续还需要加上MVVM+Rea ...

  2. 上手ReactiveCocoa之基础篇

    转自 --> http://www.jianshu.com/p/87ef6720a096 前言 很多blog都说ReactiveCocoa好用,然后各种秀自己如何灵活运用ReactiveCoco ...

  3. iOS开发UI篇—CAlayer(自定义layer)

    iOS开发UI篇—CAlayer(自定义layer) 一.第一种方式 1.简单说明 以前想要在view中画东西,需要自定义view,创建一个类与之关联,让这个类继承自UIView,然后重写它的Draw ...

  4. iOS开发UI篇—UITabBarController简单介绍

    iOS开发UI篇—UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...

  5. iOS开发UI篇—懒加载

    iOS开发UI篇—懒加载 1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了, ...

  6. iOS开发UI篇—CAlayer层的属性

    iOS开发UI篇—CAlayer层的属性 一.position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property ...

  7. iOS开发UI篇—CAlayer(创建图层)

    iOS开发UI篇—CAlayer(创建图层) 一.添加一个图层 添加图层的步骤: 1.创建layer 2.设置layer的属性(设置了颜色,bounds才能显示出来) 3.将layer添加到界面上(控 ...

  8. iOS开发UI篇—CALayer简介

    iOS开发UI篇—CALayer简介   一.简单介绍 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. 其实 ...

  9. iOS开发UI篇—核心动画(UIView封装动画)

    iOS开发UI篇—核心动画(UIView封装动画) 一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画 ...

随机推荐

  1. ruby -- 问题解决(五)页面返回跳转

    今天在做页面跳转的时候,google了下页面跳转的方法, 跳转到上一个页面:redirect_to :back <%= link_to "返回" ,:back %> 这 ...

  2. 使用Html5+C#+微信 开发移动端游戏详细教程 :(二)准备工作&开发环境

    C#开发环境:VS2013; H5开发环境:WebStorm; 数据库:mysql+navicat管理工具: 操作系统:win7: 调试:chrome浏览器 如果想在微信端上线运营游戏请做好以下准备工 ...

  3. UPW学习资料整理 .NET C# 转

    开发工具下载https://www.visualstudio.com/?Wt.mc_id=DX_MVP5000319 Windows 10 UWP开发视频1http://blogs.windows.c ...

  4. EncryptionHelper

    public static class EncryptionHelper { #region const /// <summary> /// 默认使用的适合于DES,RC2算法的Key / ...

  5. 转载---QRcodeJS生成二维码

    QRCode.js QRCode.js是依赖JS生成二维码的.主要是通过获取DOM的标签,再通过HTML5Canvas绘制而成,不依赖JQ 获取QRCode.js Github-Page:qrcode ...

  6. linq之let子句

    在Linq查询中Let子句可以创建一个新的范围变量,并使用该变量保存表达式的结果. 看下面的例子: private void LetQuery() { List<UserBaseInfo> ...

  7. 译:在ASP.NET MVC5中如何使用Apache log4net 类库来记录日志

    译文出处:http://www.codeproject.com/Articles/823247/How-to-use-Apache-log-net-library-with-ASP-NET-MVC 在 ...

  8. Servelet面试题

    1. Servlet与JSP有什么区别? Servlet和JSP完成的功能是相同的,都可以接收用户的请求,可以对用户进行响应,可以调用业务方法. 不同点在于JSP是在html或者xml中嵌入了Java ...

  9. .NET开发 正则表达式中的 Bug

    又发现了一个 .net 的 bug!最近在使用正则表达式的时候发现:在忽略大小写的时候,匹配值从 0xff 到 0xffff 之间的所有字符,正则表达式竟然也能匹配两个 ASCII 字符:i(code ...

  10. 使scp不用输入密码

    使scp不用输入密码 有些时候,我们在复制/移动文件 到另一台机器时会用到scp,因为它比较安全.但如果每次都要输入密码,就比较烦了,尤其是在script里.不过,ssh有另一种用密钥对来验证的方式. ...