您的位置:首页 > 其它

怎么用block给Button和AlertView添加点击事件

2015-12-02 19:00 477 查看
大致就是自定义一个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];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: