zoukankan      html  css  js  c++  java
  • 用block改写UIButton点击事件,block改写UIAlerView的代理

    大致就是自定义一个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]; }
     
  • 相关阅读:
    web.xml配置详解(转载)
    http协议无状态中的 "状态" 到底指的是什么?!(转载)
    sublime配置python运行环境
    Eclipse下载安装教程
    局域网访问文件共享了访问不了解决方法
    ThreadLocal实现线程级上下文
    Spring中ApplicationEvent和ApplicationListener封装
    MySQL根据出生日期计算年龄的五种方法比较
    常用正则
    java.lang.OutOfMemoryError: PermGen space有效解决方法
  • 原文地址:https://www.cnblogs.com/xiaobaizhu/p/3059048.html
Copyright © 2011-2022 走看看