【iOS开发技术】Block的使用(二)

前言

在看这篇文章之前希望大家先看一下我另外一片文章,Block的使用(一) 还有一篇 对象关联 这两篇文章。

PS:XD虽然写的不好随便看看呐~

接下来我就结合这两篇文章给大家演示一个我前端时间看到的一个比较新颖的东西吧。
PS:高手勿喷啊,新手表示这个还是挺新奇的。

简介

这里我结合一个按钮、Block、以及objc_setAssociatedObject(关联对象)三个东西给大家。

引语

Button的每个事件我们都是通过 addTarget: action: forControlEvents: 去指定的,这样我们的方法体就需要另外写,虽然说没什么问题。但是我总觉得我阅读起来要上下翻动令我很不舒服。
所以我就想,有没有办法让按钮的点击调用一个Block呢?
PS:XD既然我写了这篇文章那肯定有啦。哈哈…

正文

好了废话不多了。

[Button addTarget:self action:@(要执行的SEL) forControlEvents:UIControlEvents];

原本我们的代码需要酱紫写,才可以给一个按钮添加一个事件。
问题就是我每次都要去找那个SEL=- = 出于学习目的,我们把它改为Block形式好了

接下来看一段我写的代码吧

UIButton * b=[UIButton buttonWithType:UIButtonTypeSystem];
[btn setFrame:CGRectMake(50, 50, 100, 100)];
[btn setTitle:@”按钮B” forState:UIControlStateNormal];
[btn addBlockEventWithEvent:UIControlEventTouchUpInside withBlock:^{
NSLog(@”b按钮被点击了”);
}];

这段代码看上去就很简单了!应该不需要我多做解释了。XD

主要看一下实现吧

先看我的代码结构吧=- = 就是酱紫的。
aaa3.jpg

那我们来看两个文件的具体实现吧=- =

UIButton+Block.h

#import

#import

typedef void (^ActionBlock)();
@interface UIButton(Block)
@property (readonly) NSMutableDictionary *event;

  • (void) addBlockEventWithEvent:(UIControlEvents)controlEvent withBlock:(ActionBlock)action;

@end

UIButton+Block.m

#import “UIButton+Block.h”

@implementation UIButton(Block)

static char overviewKey;
@dynamic event;

  • (void)addBlockEventWithEvent:(UIControlEvents)event withBlock:(ActionBlock)block {
    objc_setAssociatedObject(self, &overviewKey, block, OBJC_ASSOCIATION_COPY_NONATOMIC);
    [self addTarget:self action:@selector(callActionBlock:) forControlEvents:event];
    }

  • (void)callActionBlock:(id)sender {
    ActionBlock block = (ActionBlock)objc_getAssociatedObject(self, &overviewKey);
    if (block) {
    block();
    }
    }

@end

这两段代码其实很容易理解。
主要就是我建了一个方法,然后在这个方法里面把传递的block关联到当前的button上面,酱紫按钮销毁了这个block也会跟着销毁
然后在点击事件执行当前按钮里面关联的block

XD其实我觉得这个代码太简单了,貌似没什么好说的了…

总结

从这个使用方法上我们可以有很多中延伸,比如在AlertView…等等
可以自己去实验,嘿嘿,我也是第一次搞。XD

猛击这里下载示例代码 XD ☞ButtonBlock.zip