zoukankan      html  css  js  c++  java
  • IOS 模仿TableView封装

    一.先贴一下未封装的代号,好跟后面的对比

    @interface MTHomeDropdown : UIView

    + (instancetype)dropdown;

    @property (nonatomic, strong) NSArray *categories;

    @end

    1.categories只是其中一个类型的数据传入,无法多处使用

    2.将他封装之后,可以供多个数据传入,多处使用

     

    二.封装

    @class MTHomeDropdown;

    @protocol MTHomeDropdownDataSource <NSObject>

    /**

     *  左边表格一共有多少行

     */

    - (NSInteger)numberOfRowsInMainTable:(MTHomeDropdown *)homeDropdown;

    /**

     *  左边表格每一行的标题

     *  @param row          行号

     */

    - (NSString *)homeDropdown:(MTHomeDropdown *)homeDropdown titleForRowInMainTable:(int)row;

    /**

     *  左边表格每一行的子数据

     *  @param row          行号

     */

    - (NSArray *)homeDropdown:(MTHomeDropdown *)homeDropdown subdataForRowInMainTable:(int)row;

     

    @optional

    /**

     *  左边表格每一行的图标

     *  @param row          行号

     */

    - (NSString *)homeDropdown:(MTHomeDropdown *)homeDropdown iconForRowInMainTable:(int)row;

    /**

     *  左边表格每一行的选中图标

     *  @param row          行号

     */

    - (NSString *)homeDropdown:(MTHomeDropdown *)homeDropdown selectedIconForRowInMainTable:(int)row;

    @end

     

    @interface MTHomeDropdown : UIView

    + (instancetype)dropdown;

    @property (nonatomic, weak) id<MTHomeDropdownDataSource> dataSource;

    @end

     

     

    1.声明协议:<MTHomeDropdownDataSource>,并声明协议的方法

    2.声明遵守协议的数据源 dataSource.

    3. .m

    /** 左边主表选中的行号 */

    @property (nonatomic, assign) NSInteger selectedMainRow;

     

    4.调用dataSource 方法来获得数据

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    {

        if (tableView == self.mainTableView) {

            return [self.dataSource numberOfRowsInMainTable:self];

        } else {

            return [self.dataSource homeDropdown:self subdataForRowInMainTable:self.selectedMainRow];

        }

    }

     

    5.创建MTMetaTool元数据工具类:管理所有的元数据(固定的描述数据)

    .h

    /**

     *  返回344个城市

     */

    + (NSArray *)cities;

     

    /**

     *  返回所有的分类数据

     */

    + (NSArray *)categories;

     

    /**

     *  返回所有的排序数据

     */

    + (NSArray *)sorts;

     

    .m

    static NSArray *_cities;

    + (NSArray *)cities

    {

        if (_cities == nil) {

            _cities = [MTCity objectArrayWithFilename:@"cities.plist"];;

        }

        return _cities;

    }

     

    static NSArray *_categories;

    + (NSArray *)categories

    {

        if (_categories == nil) {

            _categories = [MTCategory objectArrayWithFilename:@"categories.plist"];;

        }

        return _categories;

    }

     

    static NSArray *_sorts;

    + (NSArray *)sorts

    {

        if (_sorts == nil) {

            _sorts = [MTSort objectArrayWithFilename:@"sorts.plist"];;

        }

        return _sorts;

    }

     

     

    6.一个ZXCategoryViewController类想用homeDropdown来展示数据,就要遵循协议并实现方法

    @interface ZXCategoryViewController ()<MTHomeDropdownDataSource>

    dropdown.dataSource = self;

     

    #pragma mark - MTHomeDropdownDataSource

    - (NSInteger)numberOfRowsInMainTable:(MTHomeDropdown *)homeDropdown

    {

        return [MTMetaTool categories].count;

    }

     

    - (NSString *)homeDropdown:(MTHomeDropdown *)homeDropdown titleForRowInMainTable:(int)row

    {

        MTCategory *category = [MTMetaTool categories][row];

        return category.name;

    }

     

    - (NSString *)homeDropdown:(MTHomeDropdown *)homeDropdown iconForRowInMainTable:(int)row

    {

        MTCategory *category = [MTMetaTool categories][row];

        return category.small_icon;

    }

     

    - (NSString *)homeDropdown:(MTHomeDropdown *)homeDropdown selectedIconForRowInMainTable:(int)row

    {

        MTCategory *category = [MTMetaTool categories][row];

        return category.small_highlighted_icon;

    }

     

    - (NSArray *)homeDropdown:(MTHomeDropdown *)homeDropdown subdataForRowInMainTable:(int)row

    {

        MTCategory *category = [MTMetaTool categories][row];

        return category.subcategories;

    }

     

     

     

     

     

     

  • 相关阅读:
    oracle ORA01001,请求资源正忙或无效
    Flex[Embed(source='assets/error.png')]无法解析用于转换的代码错误
    正在覆盖未标记为 override 的函数
    LINUX umask详解
    C++服务器学习路线
    计算kappa系数
    umask的含义及设置
    Seurat的各种数据成员访问
    GAN训练判别器和生成器时的顺序与detach
    autograd.grad 学习
  • 原文地址:https://www.cnblogs.com/zhongxuan/p/5469589.html
Copyright © 2011-2022 走看看