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

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

}

IOS 模仿TableView封装的更多相关文章

  1. iOS 瀑布流封装

    代码地址如下:http://www.demodashi.com/demo/12284.html 一.效果预览 功能描述:WSLWaterFlowLayout 是在继承于UICollectionView ...

  2. Java学习-029-JSON 之三 -- 模仿 cssSelector 封装读取 JSON 数据方法

    前文简单介绍了如何通过 json-20141113.jar 提供的功能获取 JSON 的数据,敬请参阅:Java学习-028-JSON 之二 -- 数据读取. 了解学习过 JQuery 的朋友都知道, ...

  3. iOS开发tableView去掉顶部上部空表区域

    tableview中的第一个cell 里上部 有空白区域,大概64像素 在viewDidLoad中加入如下代码 self.automaticallyAdjustsScrollViewInsets = ...

  4. iOS蓝牙原生封装,助力智能硬件开发

    代码地址如下:http://www.demodashi.com/demo/12010.html 人工智能自1956年提出以来,一直默默无闻,近年来人工智能的发展得到重视逐渐发展起步,智能硬件.智能手环 ...

  5. android 仿ios 对话框已封装成工具类

    对话框 在android中是一种非经常见的交互提示用户的方式,可是非常多产品狗都叫我们这些做android的仿ios,搞的我们android程序猿非常苦逼,凭什么效果老是仿ios,有没有一点情怀,只是 ...

  6. 模仿JQuery封装ajax功能

    需求分析 因为有时候想提高性能,只需要一个ajax函数,不想引入较大的jq文件,尝试过axios,可是get方法不支持多层嵌套的json,post方式后台接收方式似乎要变..也许是我不太会用吧..其实 ...

  7. ios中tableview网封装(viewcontroller封装)常用的

    下载地址 http://pan.baidu.com/share/link?shareid=3657500168&uk=923776187 使用框架 1:asIHttpRequest库 2;SB ...

  8. ul、li模仿ios的TableView实现城市选择

    最近项目一个接着一个,之前说的精创环的项目还没做完,今天说先把那个放一下,先做访客系统,销售会见客户之后可以对客户进行一个跟踪记录,原型图也给了,今日头条的频道自定义页面一样. 如果是在IOS上让我来 ...

  9. 初学IOS之TableView

    PS:tableview作为IOS的UI界面的重点,今天我只学习一部分,在下文列出. 下文我以创建省份为例子,用纯代码的方式创建,但是并不是最优代码,仅作熟悉tableview的创建使用. ----- ...

随机推荐

  1. 【好文翻译】一步一步教你使用Spire.Doc转换Word文档格式

    背景: 年11月,微软宣布作为ECMA国际主要合作伙伴,将其开发的基于XML的文件格式标准化,称之为"Office Open XML" .Open XML的引进使office文档结 ...

  2. Codeforces Round #250 (Div. 2)——The Child and Set

    题目链接 题意: 给定goal和limit,求1-limit中的若干个数,每一个数最多出现一次,且这些数的lowbit()值之和等于goal,假设存在这种一些数,输出个数和每一个数:否则-1 分析: ...

  3. Linux的内存回收和交换

    Linux的内存回收和交换 版权声明: 本文章内容在非商业使用前提下可无需授权任意转载.发布. 转载.发布请务必注明作者和其微博.微信公众号地址,以便读者询问问题和甄误反馈,共同进步. 微博ID:or ...

  4. 简单的div元素拖拽到div

    drag1 drag2 drag3 代码如下: <!DOCTYPE HTML> <html> <head> <title>div拖拽到div</t ...

  5. Python--动态类型

    函数的参数传递,本质上传递的是引用.比如说: def f(x): x = 100 print x a = 1 f(a) print a 输出结果为: 100 1 参数x是一个新的引用,指向a所指的对象 ...

  6. C++编程练习(14)-------“单例模式”的实现

    原文:http://blog.csdn.net/oohaha_123/article/details/25190833 单例模式 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例 ...

  7. 基于css3的文字3D翻转特效

    一款基于css3的文字3D翻转特效.这款特效当鼠标经过文字的时候3D翻转显示阴影.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="compo ...

  8. VMware EXSI 6.0 体验

    VMware EXSI 6.0 体验 导读 VMware 作为虚拟化行业的老大,占据了80%的市场份额.而在服务器虚拟化就不得不说 VMware vSphere ,这个组合包括了VMware EXSI ...

  9. Android——AnimationDrawable 实现动画

    Android中的AnimationDrawable可以加载Drawable资源实现帧动画.实现步骤如下: 一.设置动画播放的帧资源 <?xml version="1.0" ...

  10. MyBatis优化技巧

    ☬配置日志文件 封装工具类 代码贴一下: package com.shxt.utils; import java.io.InputStream; import org.apache.ibatis.io ...