UIButton的两种block传值方式

UIButton的两种block传值方式

方式1 - 作为属性来传值

BlockView.h 与 BlockView.m

//
//  BlockView.h
//  Block
//
//  Created by YouXianMing on 15/1/14.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import <UIKit/UIKit.h>
@class BlockView;

/**
 定义枚举值
 */
typedef enum : NSUInteger {
    LEFT_BUTTON = 0x19871220,
    RIGHT_BUTTON,
} BUTTON_FLAG;

/**
 *  定义block
 *
 *  @param flag      枚举值
 *  @param blockView 当前的blockView
 */
typedef void (^ButtonEvent)(BUTTON_FLAG flag, BlockView *blockView);

@interface BlockView : UIView

@property (nonatomic, copy)   ButtonEvent   buttonEvent; // 作为属性的block

@property (nonatomic, strong) NSString     *leftTitle;
@property (nonatomic, strong) NSString     *rightTitle;

@end
//
//  BlockView.m
//  Block
//
//  Created by YouXianMing on 15/1/14.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "BlockView.h"

@interface BlockView ()

@property (nonatomic, strong) UIButton  *leftButton;
@property (nonatomic, strong) UIButton  *rightButton;

@end

@implementation BlockView

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {

        // 获取尺寸相关内容
        CGFloat width       = frame.size.width;
        CGFloat height      = frame.size.height;
        CGFloat buttonWidth = width / 2.f;

        // 初始化按钮
        self.leftButton     = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, buttonWidth, height)];
        self.leftButton.tag = LEFT_BUTTON;
        [self.leftButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
        [self.leftButton setTitleColor:[UIColor redColor]  forState:UIControlStateHighlighted];
        [self.leftButton setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];
        [self.leftButton addTarget:self
                            action:@selector(buttonEvents:)
                  forControlEvents:UIControlEventTouchUpInside];
        self.leftButton.titleLabel.font = [UIFont fontWithName:@"HelveticaNeue-Thin" size:12.f];
        [self addSubview:self.leftButton];

        self.rightButton     = [[UIButton alloc] initWithFrame:CGRectMake(buttonWidth, 0, buttonWidth, height)];
        self.rightButton.tag = RIGHT_BUTTON;
        [self.rightButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
        [self.rightButton setTitleColor:[UIColor redColor]  forState:UIControlStateHighlighted];
        [self.rightButton setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];
        [self.rightButton addTarget:self
                             action:@selector(buttonEvents:)
                   forControlEvents:UIControlEventTouchUpInside];
        self.rightButton.titleLabel.font = [UIFont fontWithName:@"HelveticaNeue-Thin" size:12.f];
        [self addSubview:self.rightButton];

    }
    return self;
}

- (void)buttonEvents:(UIButton *)button {
    // 如果有block值,则从block获取值
    if (self.buttonEvent) {
        self.buttonEvent(button.tag, self);
    }
}

#pragma mark - 重写setter,getter方法
@synthesize leftTitle = _leftTitle;
- (void)setLeftTitle:(NSString *)leftTitle {
    _leftTitle = leftTitle;
    [self.leftButton setTitle:leftTitle forState:UIControlStateNormal];
}
- (NSString *)leftTitle {
    return _leftTitle;
}

@synthesize rightTitle = _rightTitle;
- (void)setRightTitle:(NSString *)rightTitle {
    _rightTitle = rightTitle;
    [self.rightButton setTitle:rightTitle forState:UIControlStateNormal];
}
- (NSString *)rightTitle {
    return _rightTitle;
}

@end

控制器源码:

//
//  ViewController.m
//  Block
//
//  Created by YouXianMing on 15/1/14.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "ViewController.h"
#import "BlockView.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    BlockView *blockView        = [[BlockView alloc] initWithFrame:CGRectMake(0, 0, 200, 30)];
    blockView.layer.borderWidth = 1.f;
    blockView.leftTitle         = @"YouXianMing";
    blockView.rightTitle        = @"NoZuoNoDie";

    // 从block中获取到事件
    blockView.buttonEvent       = ^(BUTTON_FLAG flag, BlockView *blockView) {
        NSLog(@"%lu", flag);
    };

    blockView.center            = self.view.center;

    [self.view addSubview:blockView];
}

@end

 

方式2 - 作为方法来传值

BlockView.h 与 BlockView.m

//
//  BlockView.h
//  Block
//
//  Created by YouXianMing on 15/1/14.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import <UIKit/UIKit.h>
@class BlockView;

/**
 定义枚举值
 */
typedef enum : NSUInteger {
    LEFT_BUTTON = 0x19871220,
    RIGHT_BUTTON,
} BUTTON_FLAG;

/**
 *  定义block
 *
 *  @param flag      枚举值
 *  @param blockView 当前的blockView
 */
typedef void (^ButtonEvent)(BUTTON_FLAG flag, BlockView *blockView);

@interface BlockView : UIView

@property (nonatomic, strong) NSString     *leftTitle;
@property (nonatomic, strong) NSString     *rightTitle;

/**
 *  定义成方法来实现
 *
 *  @param buttonEvent block
 */
- (void)buttonEvent:(ButtonEvent)buttonEvent;

@end
//
//  BlockView.m
//  Block
//
//  Created by YouXianMing on 15/1/14.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "BlockView.h"

@interface BlockView ()

@property (nonatomic, strong) UIButton    *leftButton;
@property (nonatomic, strong) UIButton    *rightButton;
@property (nonatomic, copy)   ButtonEvent  buttonEvent;

@end

@implementation BlockView

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {

        // 获取尺寸相关内容
        CGFloat width       = frame.size.width;
        CGFloat height      = frame.size.height;
        CGFloat buttonWidth = width / 2.f;

        // 初始化按钮
        self.leftButton     = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, buttonWidth, height)];
        self.leftButton.tag = LEFT_BUTTON;
        [self.leftButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
        [self.leftButton setTitleColor:[UIColor redColor]  forState:UIControlStateHighlighted];
        [self.leftButton setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];
        [self.leftButton addTarget:self
                            action:@selector(buttonEvents:)
                  forControlEvents:UIControlEventTouchUpInside];
        self.leftButton.titleLabel.font = [UIFont fontWithName:@"HelveticaNeue-Thin" size:12.f];
        [self addSubview:self.leftButton];

        self.rightButton     = [[UIButton alloc] initWithFrame:CGRectMake(buttonWidth, 0, buttonWidth, height)];
        self.rightButton.tag = RIGHT_BUTTON;
        [self.rightButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
        [self.rightButton setTitleColor:[UIColor redColor]  forState:UIControlStateHighlighted];
        [self.rightButton setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];
        [self.rightButton addTarget:self
                             action:@selector(buttonEvents:)
                   forControlEvents:UIControlEventTouchUpInside];
        self.rightButton.titleLabel.font = [UIFont fontWithName:@"HelveticaNeue-Thin" size:12.f];
        [self addSubview:self.rightButton];
    }
    return self;
}

- (void)buttonEvents:(UIButton *)button {
    if (self.buttonEvent) {
        self.buttonEvent(button.tag, self);
    }
}

- (void)buttonEvent:(ButtonEvent)buttonEvent {
    // 初始化block
    self.buttonEvent = ^(BUTTON_FLAG flag, BlockView *blockView) {
        if (buttonEvent) {
            buttonEvent(flag, blockView);
        }
    };
}

#pragma mark - 重写setter,getter方法
@synthesize leftTitle = _leftTitle;
- (void)setLeftTitle:(NSString *)leftTitle {
    _leftTitle = leftTitle;
    [self.leftButton setTitle:leftTitle forState:UIControlStateNormal];
}
- (NSString *)leftTitle {
    return _leftTitle;
}

@synthesize rightTitle = _rightTitle;
- (void)setRightTitle:(NSString *)rightTitle {
    _rightTitle = rightTitle;
    [self.rightButton setTitle:rightTitle forState:UIControlStateNormal];
}
- (NSString *)rightTitle {
    return _rightTitle;
}

@end

控制器源码:

//
//  ViewController.m
//  Block
//
//  Created by YouXianMing on 15/1/14.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "ViewController.h"
#import "BlockView.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    BlockView *blockView        = [[BlockView alloc] initWithFrame:CGRectMake(0, 0, 200, 30)];
    blockView.layer.borderWidth = 1.f;
    blockView.leftTitle         = @"YouXianMing";
    blockView.rightTitle        = @"NoZuoNoDie";

    [blockView buttonEvent:^(BUTTON_FLAG flag, BlockView *blockView) {
        NSLog(@"%lu", flag);
    }];

    blockView.center            = self.view.center;

    [self.view addSubview:blockView];
}

@end

时间: 2025-01-01 12:30:05

UIButton的两种block传值方式的相关文章

熟知蜘蛛两种爬取方式来调整网站布局

近段时间百度对反垃圾页面的执行力度在日趋增强这让很多站点排名都受到大幅波动,当然笔者小站也不例外,但小鱼始终明白一点搜索引擎不断调整算法的本身是为了符合用户体验这也说明一点只要我们站在用户的角度去运营自己的小站那么网站的排名就自然不会差.今天笔者针对站内收录这块给大家分享下熟知蜘蛛爬取的两种方式来改变网站结构的布局. 网站收录对于很多朋友来说一直是一个追问的话题,除了我们通常所说的sitemap制作外还有一点不可小却那就是网站的层次布局,为什么这样说呢?下面笔者就蜘蛛的两种爬取方式来为你一一说道

Spring两种依赖注入方式的比较

       我们知道,Spring对象属性的注入方式有两种:设值注入和构造注入.先看代码: 假设有个类为People,该对象包含三个属性,name和school还有age,这些属性都有各自的setter和getter方法,还有一个包含这三个属性的构造方法.如果用spring来管理这个对象,那么有以下两种方式为People设置属性: 1.设值注入: ? 1 2 3 4 5 6 <bean id="people" class="com.abc.People"&g

Nginx使用的php-fpm的两种进程管理方式及优化_nginx

PS:前段时间配置php-fpm的时候,无意中发现原来它还有两种进程管理方式.与Apache类似,它的进程数也是可以根据设置分为动态和静态的. php-fpm目前主要又两个分支,分别对应于php-5.2.x的版本和php-5.3.x的版本.在5.2.x的版本中,php-fpm.conf使用的是xml格式,而在新的5.3.x版本中,则是和php.ini一样的配置风格. 在5.2.x版本中,php-fpm.conf中对于进程管理号称是有两种风格,一种是静态(static)的,一种是类似于apache

小米MI Pay怎么刷卡支付,小米MI Pay两种刷卡方式介绍

MI Pay刷卡流程 相较于传统的刷卡方式,MI Pay更加便捷安全,手机就是银行卡. MI Pay的两种刷卡方式 1.息屏或锁屏状态下,双击Home键呼出MI Pay,选择需要使用的银行卡,根据提示验证指纹之后即可靠近POS刷卡.(注:6.8.22开发版及以后版本支持双击Home键唤起MI Pay) 2.在收银员设置好POS之后,将手机靠近POS的感应区,手机上会自动弹出MI Pay页面.选择需要使用的银行卡,根据提示验证指纹之后即可靠近POS刷卡. 小米MI Pay怎么刷卡支付,小米MI P

String类型两种不同实例化方式

原题: 关于Java栈与堆的思考  1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器.但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性.另外,栈数据可以共享,详见第3点.堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据.但缺点是,由于要在运行时动态分配内存,存

Linux驱动的两种加载方式过程分析

一.概念简述 在Linux下可以通过两种方式加载驱动程序:静态加载和动态加载. 静态加载就是把驱动程序直接编译进内核,系统启动后可以直接调用.静态加载的缺点是调试起来比较麻烦,每次修改一个地方都要重新编译和下载内核,效率较低.若采用静态加载的驱动较多,会导致内核容量很大,浪费存储空间. 动态加载利用了Linux的module特性,可以在系统启动后用insmod命令添加模块(.ko),在不需要的时候用rmmod命令卸载模块,采用这种动态加载的方式便于驱动程序的调试,同时可以针对产品的功能需求,进行

【ANDROID游戏开发之十】(优化处理)详细剖析ANDROID TRACEVIEW效率检视工具,分析程序运行速度!并讲解两种创建SDCARD方式!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/316.html ----------------------- 『很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方法,这里我在博客都补充说明下,省的童鞋们总疑惑这一块:请点击下面联系进入阅读:

控件开发时两种JS嵌入资源方式的使用方法_实用技巧

第一种: 直接把要嵌入的JS文件属性设置为"嵌入的资源".protected override void OnInit(EventArgs e) {       base.OnInit (e);        if(!base.Page.IsStartupScriptRegistered("Script"))         {                 Assembly assembly = typeof(TestControl).Assembly;    

两种宽带接入网常用方式综合比较

宽带接入网有很多值得学习的地方,这里我们主要介绍ADSL和HFC两种方式,包括介绍它们之间的特点和综合的比较等方面,希望 对大家了解宽带接入网有所帮助.ADSL(Asymmetric Digital Subscriber Line,不对称数字用户线) ADSL宽带接入网方式只需一条普通的电话线,再加装一台ADSL调制解调器,用户就可以得到1-8Mbps的高速下行速率和640K-1Mbps的上行速率,传输距离可达4-5km.ADSL能提供的宽带业务有视频点播(VOD),远程教学,可视电话,多媒体检