知识点总结25:点击按钮拿到模型数据赋值的2种方法

方法一:按钮的superView父控件中,添加一个字典属性,用于储存模型数据,在需要时拿来用

  • 该字典的的key可以用btn.description
  • 该字典可以使用泛型, ZGKMeSquareModel>
#import "ZGKMeFooterView.h"
#import "AFNetworking.h"
#import "MJExtension.h"
#import "ZGKMeSquareModel.h"
#import "UIImageView+WebCache.h"
#import "UIButton+WebCache.h"

#import "ZGKMeFooterviewButton.h"

@interface ZGKMeFooterView()

/** 储存模型数据的字典----泛型 */
@property (strong, nonatomic) NSMutableDictionary *allSquares;


@end

@implementation ZGKMeFooterView
/**** 懒加载 ****/
- (NSMutableDictionary *)allSquares{
    
    if (!_allSquares) {
        _allSquares = [NSMutableDictionary dictionary];
    }
    
    return _allSquares;
}

 
/**** 根据模型数据创建对应的控件 ****/
- (void)creatSquaresBtn: (NSArray *)squares{
//
//    // 1.方块个数
//    NSUInteger count = squares.count;
//    
//    // 2.方块参数
//    int maxColsCount = 4;
//    CGFloat maxWidth = self.zgk_width / 4;
//    CGFloat maxHeight = maxWidth;
//    
//    // 3.创建按钮并设置模型数据
//    // 为了美观,添加3个空白按钮
//    for (int index = 0; index < count; index ++) {
//        ZGKMeFooterviewButton *btn = [ZGKMeFooterviewButton buttonWithType:UIButtonTypeCustom];
//        [self addSubview:btn];
//        
//        // 设置btn的frame
//        btn.zgk_x = (index % maxColsCount) * maxWidth;
//        btn.zgk_y = (index / maxColsCount) * maxHeight;
//        btn.zgk_width = maxWidth;
//        btn.zgk_height = maxHeight;
//        // 设置按钮颜色
//        btn.backgroundColor = [UIColor whiteColor];
//        
//        // 4.拿到模型数据,并赋值()
//        // 判断:如果超过了count个btn,则模型为nil
//        ZGKMeSquareModel *square = index >= 33 ? nil : squares[index];
//        
//        [btn setTitle:square.name forState:UIControlStateNormal];
//
//        // 这个方法是btn特有的,这里直接使btn,而不是btn.image来设置图片,因为按钮在设置图片时才要指定状态
//        // 需#import "UIButton+WebCache.h"
//        [btn sd_setImageWithURL:[NSURL URLWithString:square.icon] forState:UIControlStateNormal];
//        
//        // 5.监听按钮的点击
//        [btn addTarget:self action:@selector(squareBtnClick:) forControlEvents:UIControlEventTouchUpInside];
//        
//        // 6.根据返回的数据,重新设置footerview的高度,高度=最后一个按钮的bottom的最大y值
//        self.zgk_height = self.subviews.lastObject.zgk_bottom;
//        [self.tableview reloadData];

        // 7.将模型数据用字典储存,以备以后使用
        // 注意:字典的key是遵守NSCoping协议的,所以一般是NSString,控件的话,可以用控件的description属性
        self.allSquares[btn.description] = squares[index];
    }
}


/**** 超过父控件部分,点击是无法响应的,要么改变父控件的大小,要么重写hitTest方法 ****/
- (void)squareBtnClick:(ZGKMeFooterviewButton *)button{
    
    ZGKLog(@"url -- %@", self.allSquares[button.description].url);
}
   

方法二:在自定义button中添加模型属性,由button自己完成模型数据的设置

// .h文件
#import 
@class ZGKMeSquareModel;
@interface ZGKMeFooterviewButton : UIButton

/** 模型属性 */
@property (strong, nonatomic) ZGKMeSquareModel *square;
@end

// .m文件,重写set方法
- (void)setSquare:(ZGKMeSquareModel *)square{
    _square = square;
    
    [self setTitle:square.name forState:UIControlStateNormal];
    
    // 这个方法是btn特有的,这里直接使btn,而不是btn.image来设置图片,因为按钮在设置图片时才要指定状态
    // 需#import "UIButton+WebCache.h"
    [self sd_setImageWithURL:[NSURL URLWithString:square.icon] forState:UIControlStateNormal];
}
// button的父控件,footerview
/**** 根据模型数据创建对应的控件 ****/
- (void)creatSquaresBtn: (NSArray *)squares{
    
//    // 1.方块个数
//    NSUInteger count = squares.count;
//    
//    // 2.方块参数
//    int maxColsCount = 4;
//    CGFloat maxWidth = self.zgk_width / 4;
//    CGFloat maxHeight = maxWidth;
//    
//    // 3.创建按钮并设置模型数据
//    // 为了美观,添加3个空白按钮
//    for (int index = 0; index < count; index ++) {
//        ZGKMeFooterviewButton *btn = [ZGKMeFooterviewButton buttonWithType:UIButtonTypeCustom];
//        [self addSubview:btn];
//        
//        // 设置btn的frame
//        btn.zgk_x = (index % maxColsCount) * maxWidth;
//        btn.zgk_y = (index / maxColsCount) * maxHeight;
//        btn.zgk_width = maxWidth;
//        btn.zgk_height = maxHeight;
//        // 设置按钮颜色
//        btn.backgroundColor = [UIColor whiteColor];
//        
//        // 4.拿到模型数据,并赋值()
//        // 判断:如果超过了count个btn,则模型为nil
//        ZGKMeSquareModel *square = index >= 33 ? nil : squares[index];
    
        btn.square = square;
               
//        // 5.监听按钮的点击
//        [btn addTarget:self action:@selector(squareBtnClick:) forControlEvents:UIControlEventTouchUpInside];
//        
//        // 6.根据返回的数据,重新设置footerview的高度,高度=最后一个按钮的bottom的最大y值
//        self.zgk_height = self.subviews.lastObject.zgk_bottom;
//        [self.tableview reloadData];

        // 7.将模型数据用字典储存,以备以后使用
        // 注意:字典的key是遵守NSCoping协议的,所以一般是NSString,控件的话,可以用控件的description属性
//        self.allSquares[btn.description] = squares[index];
    }
}

/**** 超过父控件部分,点击是无法响应的,要么改变父控件的大小,要么重写hitTest方法 ****/
- (void)squareBtnClick:(ZGKMeFooterviewButton *)button{
    
    ZGKLog(@"url -- %@", button.square.url);
}

你可能感兴趣的:(知识点总结25:点击按钮拿到模型数据赋值的2种方法)