• 封装Button ,封装UITableView,封装UICollectionView


    ---恢复内容开始---

    封装Button ,封装UITableView,封装UICollectionView:

    1.实现Button的创建和点击事件不用分开操作处理;

    2.实现UITableView的代理数据源方法不用分开操作;

    3.实现UICollectionView的代理数据源方法不用分开操作;

    实现如下 :

    Button的实现 :

    - (void)viewDidLoad{
        
        [super viewDidLoad];
        self.view.backgroundColor = [UIColor groupTableViewBackgroundColor];
        ZH_Button *button = [[ZH_Button alloc]initWithFrame:CGRectMake(100, 100, 100, 50) normalImageString:nil highlightImageString:nil];
        [button setTitle:@"哈哈" forState:UIControlStateNormal];
        button.backgroundColor = [UIColor redColor];
        [button addActionforControlEvents:UIControlEventTouchUpInside respond:^{
    
            NSLog(@"我被点了");
        }];
        [self.view addSubview:button];
    
    }

    UITableView的实现:

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        [self loadData];
        [self createTableView];
    }
    
    - (void)loadData{
        
        NSArray *dataArray = @[@"思思1",@"思思2",@"思思3",@"思思4",@"思思5",@"思思6",@"思思7",@"思思8",@"思思9",@"思思10",@"思思11"];
        self.dataSources = [dataArray mutableCopy];
    }
    
    - (void)createTableView{
        
        _myTableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
        [self.view addSubview:self.myTableView];
        // 注册cell
        [_myTableView registerClass:[MyCell class] forCellReuseIdentifier:identifier];
        
        self.dataArray = [[ArrayDataSource alloc]initWithItems:self.dataSources cellIdentifier:identifier configureCellBlock:^(MyCell *cell, id item) {
            
            cell.title = item;
            
        } itemHeight:70];
        
        self.myTableView.dataSource = self.dataArray;
        self.myTableView.delegate = self.dataArray;
        
        __weak typeof(self)weakSelf = self;
        
        self.dataArray.didSelect = ^ (NSIndexPath *indexPath){
            
            NSString *title = weakSelf.dataSources[indexPath.row];
            NSLog(@"选择的行:indexPath = %@,标题为 : %@",indexPath,title);
            
        };
        self.dataArray.didDeselectRow = ^ (NSIndexPath *indexPath){
            
            NSLog(@"取消选择行: %@",indexPath);
        };
        self.dataArray.didHighlight = ^ (NSIndexPath *indexPath){
            
            NSLog(@"高亮行: %@",indexPath);
        };
       
    }

    UICollectionView的实现 :

    - (void)viewDidLoad{
        
        self.view.backgroundColor = [UIColor groupTableViewBackgroundColor];
        [super viewDidLoad];
        [self loadData];
        [self createCollectionView];
    }
    
    #pragma mark - createCollectionView
    
    - (void)createCollectionView{
        
        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init];
        layout.itemSize = CGSizeMake(70, 70);
        self.myCollectionView = [[UICollectionView alloc]initWithFrame:self.view.bounds collectionViewLayout:layout];
        self.myCollectionView.backgroundColor = [UIColor clearColor];
        
        // 注册cell
        [self.myCollectionView registerClass:[MyCollectionCell class] forCellWithReuseIdentifier:identifier];
        
        // 设置数据源,代理
        self.dataSourceArray = [[CollectionViewDataSource alloc]initWithItems:self.dataArray cellIdentifier:identifier configureCellBlock:^(MyCollectionCell *cell, id item) {
            
            cell.title = item;
            
        } itemSize:CGSizeMake(70, 70)];
        
        self.myCollectionView.dataSource = self.dataSourceArray;
        self.myCollectionView.delegate = self.dataSourceArray;
        [self.view addSubview:self.myCollectionView];
        
        __weak typeof(self) weakSelf = self;
        
        self.dataSourceArray.didSelect = ^ (NSIndexPath *indexPath){
            
            NSString *title = weakSelf.dataArray[indexPath.row];
            NSLog(@"选择的item:indexPath = %@,标题为 : %@",indexPath,title);
            
        };
        self.dataSourceArray.didDeselectRow = ^ (NSIndexPath *indexPath){
            
            NSLog(@"取消选择item: %@",indexPath);
        };
        self.dataSourceArray.didHighlight = ^ (NSIndexPath *indexPath){
            
            NSLog(@"高亮item: %@",indexPath);
        };
    
    }
    
    - (void)loadData{
        
        NSArray *dataArray = @[@"思思1",@"思思2",@"思思3",@"思思4",@"思思5",@"思思6",@"思思7",@"思思8",@"思思9",@"思思10",@"思思11"];
        self.dataArray = dataArray;
    }

    具体的中间的封装:

    1.Button的封装:

    typedef  void(^DGCompletionHandler)(void);
    #import <UIKit/UIKit.h>
    
    @interface ZH_Button : UIButton
    
    // 按钮触发
    - (void)addActionforControlEvents:(UIControlEvents)controlEvents respond:(DGCompletionHandler)completion;
    
    // 初始化
    -(instancetype)initWithFrame:(CGRect)frame  normalImageString:(NSString *)normalImageString highlightImageString:(NSString *)highlightImageString;
    #import "ZH_Button.h"
    #import <objc/runtime.h>
    static void *BuClickKey = @"BuClickKey";
    @implementation ZH_Button
    -(instancetype)initWithFrame:(CGRect)frame  normalImageString:(NSString *)normalImageString highlightImageString:(NSString *)highlightImageString{
        if (self = [super initWithFrame:frame]) {
            self = [ZH_Button buttonWithType:UIButtonTypeCustom];
            self.frame = frame;
            if (normalImageString) {
                     [self setImage:[UIImage imageNamed:normalImageString] forState:UIControlStateNormal];
            }
            if (highlightImageString) {
            [self setImage:[UIImage imageNamed:highlightImageString] forState:UIControlStateHighlighted];
            }
        
            
        }
        return self;
    }
    - (void)addActionforControlEvents:(UIControlEvents)controlEvents respond:(DGCompletionHandler)completion{
        
        [self addTarget:self action:@selector(didClickBU) forControlEvents:controlEvents];
        
        void (^block)(void) = ^{
            
            completion();
            
        };
        
        objc_setAssociatedObject(self, BuClickKey, block, OBJC_ASSOCIATION_COPY);
    }
    
    -(void)didClickBU{
        void (^block)(void) = objc_getAssociatedObject(self, BuClickKey);
        block();
    }

    2.UITableView的封装:

    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>  // 导入ArrayDataSource记得要导入UIKit框架,否则可能报错哟!!!
    
    typedef void (^shouldHighlight)(NSIndexPath*);
    typedef void (^didSelect)(NSIndexPath *indexPath);
    typedef void (^didHighlight)(NSIndexPath *indexPath);
    typedef void (^didDeselectRow)(NSIndexPath *indexPath);
    typedef void (^TableViewCellConfigureBlock)(id cell, id item);
    
    @interface ArrayDataSource : NSObject <UITableViewDataSource,UITableViewDelegate>
    @property(nonatomic,copy)didSelect didSelect;
    @property(nonatomic,copy)didHighlight  didHighlight;
    @property(nonatomic,strong)shouldHighlight shouldHighlight;
    @property(nonatomic,strong)didDeselectRow didDeselectRow;
    
    - (id)initWithItems:(NSArray *)anItems
         cellIdentifier:(NSString *)aCellIdentifier
         configureCellBlock:(TableViewCellConfigureBlock)aConfigureCellBlock
         itemHeight:(float)itemHeight;
    - (id)itemAtIndexPath:(NSIndexPath *)indexPath;
    
    @end
    #import "ArrayDataSource.h"
    
    
    @interface ArrayDataSource ()
    
    @property (nonatomic, strong) NSArray *items;
    @property (nonatomic, copy) NSString *cellIdentifier;
    @property(nonatomic, assign)float itemHeight;
    
    @property (nonatomic, copy) TableViewCellConfigureBlock configureCellBlock;
    
    @end
    
    
    @implementation ArrayDataSource
    
    #pragma mark - Init
    
    - (id)init
    {
        return nil;
    }
    
    - (id)initWithItems:(NSArray *)anItems
         cellIdentifier:(NSString *)aCellIdentifier
     configureCellBlock:(TableViewCellConfigureBlock)aConfigureCellBlock itemHeight:(float)itemHeight
    {
        self = [super init];
        if (self) {
            self.items = anItems;
            self.cellIdentifier = aCellIdentifier;
            self.configureCellBlock = [aConfigureCellBlock copy];
            self.itemHeight = itemHeight;
        }
        return self;
    }
    
    - (id)itemAtIndexPath:(NSIndexPath *)indexPath
    {
        return self.items[(NSUInteger) indexPath.row];
    }
    
    
    #pragma mark UITableView Delegate
    
    -(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath{
        if (self.didHighlight) {
            self.didHighlight(indexPath);
        }
        
    }
    -(BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath{
        if (self.shouldHighlight) {
         self.shouldHighlight(indexPath);
        }
        
        return YES;
    }
    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
        return self.itemHeight;
    }
    
    -(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{
        
        if (self.didDeselectRow) {
            self.didDeselectRow(indexPath);
        }
        
    }
    
    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
        if (self.didSelect) {
            self.didSelect(indexPath);
        }
    }
    
    #pragma mark - UITableView DataSource
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        if (self.items.count == 0) {
            NSLog(@"什么鬼");
        }
        return self.items.count;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:self.cellIdentifier];
        if (!cell) {
            cell = [tableView dequeueReusableCellWithIdentifier:self.cellIdentifier forIndexPath:indexPath];
        }
        id item = [self itemAtIndexPath:indexPath];
        if (self.configureCellBlock) {
            self.configureCellBlock(cell, item);
        }
        return cell;
    }

    3.UICollectionView的封装:

    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    
    /** 数据源,代理回调block*/
    
    typedef void (^shouldHighlight)(NSIndexPath*);
    typedef void (^didSelect)(NSIndexPath *indexPath);
    typedef void (^didHighlight)(NSIndexPath *indexPath);
    typedef void (^didDeselectRow)(NSIndexPath *indexPath);
    typedef void (^CollectionViewCellConfigureBlock)(id cell, id item);
    
    
    @interface CollectionViewDataSource : NSObject<UICollectionViewDelegate,UICollectionViewDataSource>
    
    @property(nonatomic,copy)didSelect didSelect;
    @property(nonatomic,copy)didHighlight  didHighlight;
    @property(nonatomic,strong)shouldHighlight shouldHighlight;
    @property(nonatomic,strong)didDeselectRow didDeselectRow;
    
    // 初始化方法
    - (id)initWithItems:(NSArray *)anItems
         cellIdentifier:(NSString *)aCellIdentifier
     configureCellBlock:(CollectionViewCellConfigureBlock)aConfigureCellBlock
             itemSize:(CGSize)itemSize;
    
    // 根据indexPath取得对应的item
    - (id)itemAtIndexPath:(NSIndexPath *)indexPath;
    
    @end
    #import "CollectionViewDataSource.h"
    
    @interface CollectionViewDataSource ()
    
    @property (nonatomic, strong) NSArray *items;
    @property (nonatomic, copy) NSString *cellIdentifier;
    @property(nonatomic,assign)CGSize  itemSize;
    
    @property (nonatomic, copy) CollectionViewCellConfigureBlock configureCellBlock;
    
    @end
    
    @implementation CollectionViewDataSource
    
    #pragma mark - Init
    
    - (instancetype)init{
        
        return nil;
    }
    
    - (id)initWithItems:(NSArray *)anItems
         cellIdentifier:(NSString *)aCellIdentifier
     configureCellBlock:(CollectionViewCellConfigureBlock)aConfigureCellBlock
               itemSize:(CGSize)itemSize
    {
        self = [super init];
        if (self) {
            self.items = anItems;
            self.cellIdentifier = aCellIdentifier;
            self.configureCellBlock = [aConfigureCellBlock copy];
            self.itemSize = itemSize;
        }
        return self;
    }
    
    - (id)itemAtIndexPath:(NSIndexPath *)indexPath
    {
        return self.items[(NSUInteger) indexPath.row];
    }
    
    #pragma mark - UICollectionView DataSource
    
    - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
        
        if (self.items.count == 0) {
            
            NSLog(@"数组为空啦!!!");
        }
        return self.items.count;
    }
    
    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
        
        UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:self.cellIdentifier forIndexPath:indexPath];
        if (!cell) {
            cell = [[UICollectionViewCell alloc]init];
        }
        id item = [self itemAtIndexPath:indexPath];
        if (self.configureCellBlock) {
            self.configureCellBlock(cell,item);
        }
        return cell;
        
    }
    #pragma mark - UICollectionView Delegate
    
    - (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath{
        
        if (self.didDeselectRow) {
            self.didDeselectRow(indexPath);
        }
    }
    
    - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
        
        if (self.didSelect) {
            self.didSelect(indexPath);
        }
    }
    
    - (void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath{
        
        if (self.didHighlight) {
            self.didHighlight(indexPath);
        }
    }
    
    //定义每个UICollectionView 的大小
    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
    {
        return self.itemSize;
    }
    
    @end

    ---恢复内容结束---

  • 相关阅读:
    如何批量查看容器内部的进程?
    如何一键将k8s中configmap以及secret的配置变成本地环境变量
    如何快速批量下载m3u8(ts)视频?
    如何快速搜索?
    【待学习】知识点/小类
    【待学习】科目/大类
    总览:SpringCloud基础结构
    AES 加密解密
    JVM学习:方法重载的优先级
    反射操作数组---反序列化小知识
  • 原文地址:https://www.cnblogs.com/pengsi/p/5780019.html
Copyright © 2020-2023  润新知