大致就是自定义一个BlockButton继承UIButton,然后在里面用
addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents
这个方法触发block,代码很简单,不多说了
BlockButton.h
@class BlockButton; typedef void (^TouchButton)(BlockButton*); @interface BlockButton : UIButton @property(nonatomic,copy)TouchButton block; @end
BlockButton.m
#import "BlockButton.h" #import <QuartzCore/QuartzCore.h>//这里要注意,如果想使用UIButton的layer属性更改button样式,要添加QuartzCore.framewor并且在头文件导入。 @implementation BlockButton - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.layer.masksToBounds = YES; self.layer.cornerRadius = 10; self.layer.borderWidth = 2; self.layer.shadowRadius = 2; self.layer.shadowColor = [UIColor grayColor].CGColor; self.layer.borderColor = [UIColor redColor].CGColor; [self addTarget:self action:@selector(touchAction:) forControlEvents:UIControlEventTouchUpInside]; } return self; } - (void)touchAction:(id)sender{ _block(self); } @end
ViewController.h里面没有添加任何代码
下面是ViewController.m
#import "ViewController.h" #import "BlockButton.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; BlockButton *button = [[BlockButton alloc]initWithFrame:CGRectMake(100, 100, 40, 20)]; [button setBlock:^(BlockButton *button){ NSLog(@"按下去了"); }]; [self.view addSubview:button]; [button release]; for (int i = 0; i < 3; i ++) { BlockButton *btn = [[BlockButton alloc]initWithFrame:CGRectMake(40 + i*70, 200, 50, 25)]; [btn setTitle:[NSString stringWithFormat:@"%d",i] forState:UIControlStateNormal]; [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; btn.block = ^(BlockButton *btn){ NSLog(@"按下%d",i); }; [self.view addSubview:btn]; [btn release]; } } @end
下面再改写Alert这个控件,思路是一样的,在自定义的Alert里面用block触发点击事件,而在Alert定义的代码里执行事件触发的行为。
AlertBlock.h
#import <UIKit/UIKit.h> @class AlertBlock; typedef void (^TouchBlock)(NSInteger); @interface AlertBlock : UIAlertView @property(nonatomic,copy)TouchBlock block; //需要自定义初始化方法,调用Block - (id)initWithTitle:(NSString *)title message:(NSString *)message cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString*)otherButtonTitles block:(TouchBlock)block; @end
AlertBlock.m
#import "AlertBlock.h" @implementation AlertBlock - (id)initWithTitle:(NSString *)title message:(NSString *)message cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString*)otherButtonTitles block:(TouchBlock)block{ self = [super initWithTitle:title message:message delegate:self cancelButtonTitle:cancelButtonTitle otherButtonTitles:otherButtonTitles, nil];//注意这里初始化父类的 if (self) { self.block = block; } return self; } //#pragma mark -AlertViewDelegate - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ //这里调用函数指针_block(要传进来的参数); _block(buttonIndex); } @end
ViewController.m
#import "ViewController.h" #import "AlertBlock.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside]; button.frame = CGRectMake(self.view.bounds.size.width/2, self.view.bounds.size.height/2, 80, 30); [self.view addSubview:button]; } - (void)buttonAction:(id)sender{ AlertBlock *alert = [[AlertBlock alloc]initWithTitle:@"提示" message:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定" block:^(NSInteger buttonIndex){
//在这里面执行触发的行为,省掉了代理,这样的好处是在使用多个Alert的时候可以明确定义各自触发的行为,不需要在代理方法里判断是哪个Alert了 if (buttonIndex == 0) { NSLog(@"取消"); }else if (buttonIndex == 1){ NSLog(@"确定"); } }]; [alert show]; [alert release]; }