1.Block是什么?
Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,可以看成一个语句块或者更多时候看成一个匿名函数。
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations NS_AVAILABLE_IOS(4_0);
[ UIView animateWithDuration:10 animations:^{
NSLog(@"%@,",@"block");
}];
2.Block在什么情况下使用?
Block除了能够定义参数列表、返回类型外,还能够获取被定义时的词法范围内的状态(比如局部变量),并且在一定条件下(比如使用__block变量)能够修改这些状态。此外,这些可修改的状态在相同词法范围内的多个block之间是共享的,即便出了该词法范围(比如栈展开,出了作用域),仍可以继续共享或者修改这些状态。通常来说,block都是一些简短代码片段的封装,适用作工作单元,通常用来做并发任务、遍历、以及回调。
3.Block如何申明?(对比于c语言中的函数申明)
4.如何调用Block?(类比于函数指针)
int (*CFunc) (int a) //函数调用
int result = CFunc(10);
int (^BFunc) (int a) //Block调用
int result = BFunc(10);
5.Block编程实例(实现回调)
#import <UIKit/UIKit.h>
/**
* 点击按钮的回调
*
* @param selectIndex selectIndex 点击的索引值
*/
typedef void(^DialogViewCompleteHandle)(NSUInteger selectIndex);
@interface ViewController : UIViewController
@property (nonatomic,copy) DialogViewCompleteHandle completeHandle;
- (void)showDialogViewWithHandle:(void (^)(NSUInteger selectIndex))handler;
#define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
#define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height
#import "ViewController.h"
@interface ViewController ()
{
UIView *_view;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)showAlert:(id)sender {
[self showDialogViewWithHandle:^(NSUInteger selectIndex) {
if (selectIndex == 0) {
NSLog(@"第一个按钮被点击了!");
}else
{
NSLog(@"第二个按钮被点击了!");
}
}];
}
- (void)showDialogViewWithHandle:(void (^)(NSUInteger selectIndex)) handler
{
_view = [UIView new];
_view.center = CGPointMake(SCREEN_WIDTH /2, SCREEN_HEIGHT / 2);
_view.bounds = CGRectMake(0, 0, SCREEN_WIDTH /2, SCREEN_HEIGHT /2);
_view.backgroundColor = [UIColor lightGrayColor];
[self.view addSubview:_view];
CGRect viewFrame = _view.frame;
UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button1.center = CGPointMake(viewFrame.size.width /2, viewFrame.size.height /2 - 50);
button1.bounds = CGRectMake(0, 0, 60, 40);
button1.tag = 0;
[button1 setTitle:@"button1" forState:UIControlStateNormal];
[button1 addTarget:self action:@selector(clickButton:) forControlEvents:UIControlEventTouchUpInside];
[_view addSubview:button1];
UIButton *button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button2.center = CGPointMake(viewFrame.size.width /2, viewFrame.size.height /2 + 50);
button2.bounds = CGRectMake(0, 0, 60, 40);
button2.tag = 1;
[button2 addTarget:self action:@selector(clickButton:) forControlEvents:UIControlEventTouchUpInside];
[button2 setTitle:@"button2" forState:UIControlStateNormal];
[_view addSubview:button2];
_view.transform = CGAffineTransformMakeScale(0.01, 0.01);
[UIView animateWithDuration:0.3 animations:^{
_view.transform = CGAffineTransformMakeScale(1.0, 1.0);
}];
self.completeHandle = handler;
}
- (void)clickButton:(UIButton *)sender
{
NSUInteger selIndex = sender.tag;
if (_completeHandle) {
_completeHandle(selIndex);
}
[self closeView];
}
- (void)closeView{
[UIView animateWithDuration:0.3 animations:^{
_view.transform = CGAffineTransformMakeScale(0.01, 0.01);
[_view removeFromSuperview];
}];
}
@end
点击button1 和 button2 可以实现按钮的回调Block
时间: 2024-10-22 05:01:25