今天学习了block语法的使用。
对象之间的通信,可以使用代理,还可以使用通知。而block语法也可以让对象之间相互通信。与代理方法一样,也是通过回调来实现的。
比如在A类中声明一个block,在某个事件下会调用block。然后B类创建了A类实例,并设置A类的block,编写block的实现。在A类遇到某个事件调用block时,就会调用B类中block的代码,执行相应操作。
下面我们用代码来实现block语法。
首先我们创建一个MyButton类,继承于UIButton。接着我们声明一个名为buttonBlock的block。
//声明block
@property(nonatomic,copy) void(^buttonBlock)(MyButton*);
然后我们给MyButton类添加一个监听的事件。
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
//添加事件
[self addTarget:self action:@selector(Click) forControlEvents:UIControlEventTouchUpInside];
}
return self;
}
当被按下时,会执行Click方法。在Click方法中,我们调用block。
//点击后的方法
-(void)Click{
//回调block
self.buttonBlock(self);
}
编写完MyButton类,我们在应用的代理类中创建它。
//创建我的按钮
MyButton *myButton = [[MyButton alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
[myButton setTitle:@"点击" forState:UIControlStateNormal];
myButton.backgroundColor = [UIColor redColor];
接着编写block的实现,并将它赋给MyButton类的实例。我们在block中改变MyButton的颜色。
//编写回调的block
myButton.buttonBlock = ^(MyButton *button){
//改变颜色
if (button.backgroundColor == [UIColor redColor]) {
button.backgroundColor = [UIColor blueColor];
}
else
button.backgroundColor = [UIColor redColor];
};
然后创建一个视图控制器,将MyButton类的实例添加到它上面。最后将控制器设置为window的根视图控制器,并执行。
//创建控制器
UIViewController *viewController = [[UIViewController alloc] init];
//添加按钮
[viewController.view addSubview:myButton];
//设控制器为window的根控制器
self.window.rootViewController=viewController;
运行后,点击按钮,按钮颜色发生变化,MyButton类回调了block中的代码。
运行结果截图: