首先真的真的很是感谢在Segmentfault上给我点赞收藏我文章的朋友,大家真的真的给了我很大的动力去继续写一些有关iOS开发的文章。大可放心我博客的更新程度,只要我有新的能够写的东西我不管如何都会抽时间写的。html
ps:若是能够的话下次点到 个人博客 去看吧,我以为那个看上去比Segmentfault界面要好看一些。并且有一些以前的文章也能够参考。react
最近项目很是繁忙...上星期原本想把和block内存管理有关的东西看一下再写一个有关block的博客的后来有关block内存管理的博客都找好了没时间实战也就没出。
写了有两周的项目,由于不少缘由因此这近两周一直在写界面,可是在写界面的时候用到了ReactiveCocoa的东西,也是由于实践了因此写篇博客分享出来。ios
ReactiveCocoa(下文统称为RAC)
,具体我就不介绍了,能够去个人博客里那篇还没填完坑的 mvvm开发模式 文章看一下。mvvm
我的觉得,RAC能够以信号的方式来触发各类动做,从而让代码更加精炼。ide
在UIButton上的使用
[[self.testBtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) { TestViewController *testVC = [[TestViewController alloc] init]; [self.navigationController pushViewController:testVC animated:YES]; }];
在这里,对uibutton添加了一个rac_signalForControlEvents的方式,就不用利用addtarget的方式来再写一个方法来进行对uibutton添加点击事件了。函数
在UIAlertView的使用
UIAlertView *chooseAlert = [[UIAlertView alloc] initWithTitle:@"选择图片上传" message:nil delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"拍照上传", @"从相册选择", nil]; [chooseAlert show]; [[chooseAlert rac_buttonClickedSignal] subscribeNext:^(NSNumber *indexNumber) { if ([indexNumber intValue] == 1) { [self chooseFromCamera]; } else if ([indexNumber intValue] == 2) { [self chooseFromAlbum]; } }];
这两个是limeboy在博客里提到的。由于有了RAC,因此我此次放弃使用blockskit和alertview的Categories。ui
下面两个是我利用RAC的方式写的代码。code
在UITextfield的使用
第一个是我封装了一个安卓风格的输入框,就是下面一条线,当选择这个框的时候,线会加粗变黑。
我把中间的两句核心代码贴出来。self是由于我继承了一个textfield先进行功能添加和封装。因此self就是代指一个textfield了。htm
[[self rac_signalForControlEvents:UIControlEventEditingDidBegin] subscribeNext:^(NSNumber *editing) { self.bottomBorder.backgroundColor = [UIColor blackColor].CGColor; }]; [[self rac_signalForControlEvents:UIControlEventEditingDidEnd] subscribeNext:^(NSNumber *editing) { self.bottomBorder.backgroundColor = [UIColor grayColor].CGColor; }];
其实这两句是能够用addtarget的方式来添加的,可是我选择了用RAC的方式,更为简单也更为容易理解。当textfield被选中的时候,下面的borderline会变成黑色,当结束选择的时候,变成灰色。(其实当选择的时候borderline应该还要加粗)。继承
监控UIPagecontrol改变
还有一个地方我利用到了RAC。由于我如今须要实现一个功能,图片轮播的时候,当图片切换,我须要相应的刷新下面的一个列表。由于咱们的图片轮播是用到的一个开源控件,我实在是能力有限不知道怎么进一步修改这个控件来进一步封装从而实现新的功能,我就利用了RAC。
[RACObserve(self.imagePlayer.pageControl, currentPage) subscribeNext:^(id x) { [self refreshSlideContent:self.imagePlayer.pageControl.currentPage]; }];
上面的代码将pageControl和它的currentPage属性相绑定,当currentPage改变的时候就会触发下面的函数。而后我传了一个currentPage的参数进去,从而下面的列表能够进一步更新。可是开始加载的时候会调用3次…我不知道我哪一个地方写坑了我还在寻找。各位见谅…
上面的几个代码片断就是我这两周在写纯界面的时候用到的一些和RAC有关的东西,由于自己就是写纯界面,因此没用到不少,也很简单,没有其余的功能。刚刚在查limeboy博客的时候看到NotificationCenter也能够利用RAC的方式写,我抽时间也会尝试,由于项目里没用到,因此就不贴代码了。
BTW:最近有一大波考试,博客更新程度会大大下降...后面可能会一直作项目,等积累一部分才会继续写了。多谢各位的支持。
Limboy 说说ReactiveCocoa 2