代码改变世界

iOS获取按钮点击的模型数据

2017-11-24 14:53  PingKang  阅读(602)  评论(0编辑  收藏  举报

在iOS的整个开发过程中,都会使用到最基本的视图控件UIButton,在页面上只有单个按钮负责响应用户的点击事件时,点击按钮后的回调事件中可以从当前控制器中获取到方法想要得到的内容模型,但是在一个页面中存在同类型的按钮有很多个,或者我们需要使用for循环来创建按钮时,刚开始的方法是给UIButton的试图设置不同的tag,然后绑定一个同一个点击事件,在点击事件中通过对tag值转化为数组元素的index,进而从数组中获取元素,这种虽然可行 ,但是从代码理解层面和面向对象的层面考虑的话,这种方法并不能很好的解释按钮需要传递的数据是什么,而且tag值并不能保证是唯一的;所以就引出的了我们今天的话题,如何利用自定义的UIButton传递数据?


其实很简单,我们定义一个继承自UIButton的子类,在其头文件中增加一个对数据模型持有的属性,如下:

//
//  CommentImageButton.h
//
//  Created by pk on 2017/9/6.
//  Copyright © 2017年 pk. All rights reserved.
//
 
#import <UIKit/UIKit.h>
 
@interface CommentImageButton : UIControl
 
@property (nonatomic,strong)UIImageView * imageView;
 
@property (nonatomic,strong)id holdContent;
 
@end

 

上述文件中的holdContent就是我们所说的用来持有数据实体的

而我们在给button的实体绑定点击方法时,一般都会定义成如下形式:

- (void)clickImageBtn:(CommentImageButton *)sender{
   
}

 

或者

- (void)clickImageBtn:(id)sender{
   
}

 

然后我们在使用的时候直接取button的实体的holdContent属性,然后对其进行相应的类型转换就可以了,例如:

- (void)clickImageBtn:(id)sender{
    CommentImageButton * imageBtn = (CommentImageButton *)sender;
    if ([self.delegate respondsToSelector:@selector(clickNearStoreItem:)]) {
        SimpleOnLineStore * store = (SimpleOnLineStore *)imageBtn.holdContent;
        [self.delegate clickNearStoreItem:store];
    }
}

 

上述方法中 我们就避免了利用UIView的tag的属性值去获取数据实体,此种方法更加精确,

如有更好的方法,欢迎交流