zoukankan      html  css  js  c++  java
  • 为UITableViewController瘦身

    在IOS开发中采用了MVC得模式,ViewController通常是最庞大的文件,里面包含了各种各样的大概,造成代码的复用率低下,可读性也降低,那么有什么办法来解决这个问题呢。

    在创建Table的时候,绑定数据源需要实现三个委托
    - (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    - (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
    每次写表格都要重新实现这三个方法,有没有什么方法可以复用这些代码呢。

    我们来分析一下,一般表格的数据源都是一个数组。Cell的数量就是数组的数量,那么既然找到了规律,我们就可以吧这一部分的代码提取出来。

    分离DataScource

    我们先来新建一个类叫做ArrayDataSource

    首先有一个- (id)initWithItems:(NSArray *)anItems multipleItem:(BOOL)multipleItem cellIdentifier:(NSString *)aCellIdentifier configureCellBlock:(TableViewCellConfigureBlock)aConfigureCellBlock;方法用来初始化。它有四个参数,第一个items,很显然这个是数据源的数组,第二个multipleItem是一个BOOL类型的值,用来说明传入的数组是否是多维数组,用以Group类型的表格数据源传入,第三个aCellIdentifier 是cell的标识符,复用cell的时候会用到,第四个参数是aConfigureCellBlock 一个配置cell的Block回调方法。

    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    
    typedef void (^TableViewCellConfigureBlock)(id cell, id item);
    
    @interface ArrayDataSource : NSObject <UITableViewDataSource,UITableViewDelegate>
    
    
    /**
     *  初始化表格方法 
     *  根据数据源自动计算出数量,支持二位数组
     *  使用二维数组的时候,将multipleItem值设为YES即可完成数据的输入
     *
     *  @param anItems             数据源
     *  @param aCellIdentifier     cell标示符
     *  @param aConfigureCellBlock 配置cell方法的block回调方法
     *
     *  @return id
     */
    - (id)initWithItems:(NSArray *)anItems
           multipleItem:(BOOL)multipleItem
         cellIdentifier:(NSString *)aCellIdentifier
     configureCellBlock:(TableViewCellConfigureBlock)aConfigureCellBlock;
    
    - (id)itemAtIndexPath:(NSIndexPath *)indexPath;
    @end
    
    

    ArrayDataSource.h

    @implementation ArrayDataSource
    
    - (id)initWithItems:(NSArray *)anItems
           multipleItem:(BOOL)multipleItem
         cellIdentifier:(NSString *)aCellIdentifier
     configureCellBlock:(TableViewCellConfigureBlock)aConfigureCellBlock
    {
        
        self = [super init];
        if (self) {
            _items = anItems;
            _cellIdentifier = aCellIdentifier;
            _configureCellBlock = [aConfigureCellBlock copy];
            _isMultiple=multipleItem;
        }
        return self;
    }
    
    - (id)itemAtIndexPath:(NSIndexPath *)indexPath
    {
        return [_items objectAtIndex:indexPath.row];
    }
    
    
    - (NSInteger)tableView:(UITableView*)tableView
     numberOfRowsInSection:(NSInteger)section {
        if(_isMultiple)
        {
            return [[_items objectAtIndex:section] count];
        }
        else
        {
            return [_items count];
        }
    }
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        if (_isMultiple) {
            return [_items count];
        }
        else
        {
            return 1;
        }
    }
    
    
    
    - (UITableViewCell*)tableView:(UITableView*)tableView
            cellForRowAtIndexPath:(NSIndexPath*)indexPath {
        id cell = [tableView dequeueReusableCellWithIdentifier:_cellIdentifier
                                                  forIndexPath:indexPath];
        if (_isMultiple) {
            NSArray *Sectionitem = [_items objectAtIndex:indexPath.section];
            self.configureCellBlock(cell, [Sectionitem objectAtIndex:indexPath.row]);
            //self.configureCellBlock(cell, @"fdgdf");
        }
        else
        {
            id item = [self itemAtIndexPath:indexPath];
            self.configureCellBlock(cell, item);
        }
        
        return cell;
    }
    
    

    以上就是这个简单类的部分代码,接下来我们来看一下如何简单的实现数据源的传入

    TableViewCellConfigureBlock configureCell = ^(UITableViewCell *cell, NSString *photo) {
            cell.textLabel.text=photo;
        };
        NSArray *item1= @[@"sasewrwer",@"f22f",@"fff"];
        NSArray *item2= @[@"sas",@"ff",@"gfdfsd"];
        NSArray *item=  @[item1,item2];
        
        _photosArrayDataSource = [[ArrayDataSource alloc] initWithItems:item
                                                           multipleItem:YES
                                                        cellIdentifier:@"cell"
                                                    configureCellBlock:configureCell];
        self.tableView.dataSource = _photosArrayDataSource;
        [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];
    

    只需要三四行代码即可完成Table的数据源传入,而不用再去实现Delegate,这样使得ViewController的代码更加简洁,代码的重用性变高。

    思路来源于objcio

    以上代码在GitHub可以下载,仅供参考

  • 相关阅读:
    大数据技术之_04_Hadoop学习_02_HDFS_DataNode(面试开发重点)+HDFS 2.X新特性
    大数据技术之_04_Hadoop学习_01_HDFS_HDFS概述+HDFS的Shell操作(开发重点)+HDFS客户端操作(开发重点)+HDFS的数据流(面试重点)+NameNode和SecondaryNameNode(面试开发重点)
    请不要重复犯我在学习Python和Linux系统上的错误
    教你如何在Kali Linux 环境下设置蜜罐?
    Docker 基础技术:Linux Namespace(下)
    真有用?Snap和Flatpak 通吃所有发行版的打包方式。
    安装Fedora 24后必要的设置
    爆料喽!!!开源日志库Logger的剖析分析
    简单易懂的crontab设置工具集
    新手必看,老鸟绕道–LAMP简易安装
  • 原文地址:https://www.cnblogs.com/mrchenhao/p/4213037.html
Copyright © 2011-2022 走看看