前言:

上一篇讲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. react native之组织组件

    这些组件包括<TabView>,<NavigatorView>和<ListView>,他们实现了手机端最常用的交互和导航.你会发现这些组件在实际的项目中会非常有用. ...

  2. 如何准备阿里社招面试,顺谈 Java 程序员学习中各阶段的建议

    引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...

  3. IOS开发UI基础UISlide属性

    UISlide属性 •    minimumValue  : 当值可以改变时,滑块可以滑动到最小位置的值,默认为0.0_slider.minimumValue = 10.0; •    maximum ...

  4. ChartDirector应用笔记(一)

    ChartDirector介绍 ChartDirector是一款小巧精细的商业图表库.其适用的语言范围非常广泛,包括.Net, Java, Asp, VB, PHP, Python, Ruby, C+ ...

  5. Winform开发框架之客户关系管理系统(CRM)的报价单和销售单的处理

    在前面介绍了很多CRM相关的界面和实现思路的随笔文章,本篇继续介绍一下系统中用到的一些经验和技巧片段.本篇随笔主要介绍客户关系管理系统(CRM)的报价单和销售单的处理界面效果,使用列表内置的选择代替弹 ...

  6. asp.net mvc 4 json大数据异常 提示JSON字符长度超出限制的异常

    今天客户突然过来找我说在后台添加了一篇超长的文章后,所有后台的文章都显示不出来了.后台的前端显示是用easyui的,返回的数据全是用json.根据客户的描述进行了同样的操作后,在firebug下发现a ...

  7. 解决IIS Web部署 svg/woff/woff2字体 404错误

    最近在IIS上部署web项目的时候,发现浏览器总是报找不到woff.woff2字体的错误.导致浏览器加载字体报404错误,白白消耗了几百毫秒的加载时间. 一开始以为是路径的问题,检查发现路径也没错. ...

  8. JSChart_页面图形报表

    首先在页头的"head"中加上: $(document).ready(function() { //myData与colors变量  是做演示用的,可以直接赋值给myChart就可 ...

  9. csharp: get Web.Services WebMethod

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  10. cURL和HTTPie

    http://lingxiankong.github.io/blog/2014/08/19/curl-httpie/ 前两天在网上看到一个号称比cURL更牛逼的命令行工具HTTPie,提供命令行交互方 ...