• 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;

    }

     

     

     

     

     

     

  • 相关阅读:
    UILabel 自适应大小
    CGAffineTransformScale
    CAKeyframeAnimation
    CABasicAnimation
    IOS 动画
    xcode 怎么样在发布release版本的时候 不输出log
    [转贴] C++ 判断主机是否处于联网状态下
    [转贴] 从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开
    [转贴]从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介
    [转贴]gsoap使用心得!
  • 原文地址:https://www.cnblogs.com/zhongxuan/p/5469589.html
Copyright © 2020-2023  润新知