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

大致就是自定义一个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];
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自定义UIAlertView的方法已经在iOS13之后被废弃,推荐使用UIAlertController来代替。下面介绍如何自定义UIAlertController的弹出位置以及宽度。 1. 自定义弹出位置 可以使用UIAlertController的popoverPresentationController属性来设置弹出位置。具体步骤如下: ``` // 创建UIAlertController对象 UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title" message:@"Message" preferredStyle:UIAlertControllerStyleAlert]; // 创建弹出位置的UIView对象 UIView *popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)]; // 设置弹出位置 alertController.popoverPresentationController.sourceView = popoverView; alertController.popoverPresentationController.sourceRect = popoverView.bounds; // 弹出UIAlertController [self presentViewController:alertController animated:YES completion:nil]; ``` 2. 自定义宽度 可以通过设置UIAlertController的preferredContentSize属性来改变其宽度。具体步骤如下: ``` // 创建UIAlertController对象 UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title" message:@"Message" preferredStyle:UIAlertControllerStyleAlert]; // 设置宽度 alertController.preferredContentSize = CGSizeMake(280, 200); // 弹出UIAlertController [self presentViewController:alertController animated:YES completion:nil]; ``` 需要注意的是,此方法只适用于UIAlertControllerStyleAlert风格的UIAlertController。如果使用UIAlertControllerStyleActionSheet风格的UIAlertController,设置preferredContentSize属性将不会生效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值