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

@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. HTML之一语言代码

    HTML的lang属性可用于网页或部分网页的语言.这对搜索引擎和浏览器是有帮助的. 同时也可以是指HTTP Header中的Accept-Language/Content-Language. ISO ...

  2. 高级I/O之I/O多路转接——pool、select

    当从一个描述符读,然后又写到另一个描述符时,可以在下列形式的循环中使用阻塞I/O: ) if (write(STDOUT_FILENO, buf, n) != n) err_sys("wri ...

  3. 乱谈Qt事件循环嵌套

    本文旨在说明:QDialog::exec().QMenu::exec()等开启的局部事件循环,易用的背后,还有很多的陷阱... 引子 Qt 是事件驱动的,基本上,每一个Qt程序我们都会通过QCoreA ...

  4. XMPP协议、IM、客户端互联详解

    导读 对于推送,IM服务器,目前可以使用一些厂家提供的SDK来实现,但是我们的老板又总是担心使用别人的SDK,假如别人的服务出现问题,或者别人偷看咱们的信息,那岂不是出现很大问题了 聊一聊xmpp的服 ...

  5. java 简单矩阵乘法运算

    1.计算的两个矩阵其中第一个矩阵的列数必须和第二个矩阵的行数一致(或者反过来): 2.第一个矩阵的行数决定了结果矩阵的行数,第二个矩阵的列数决定了结果矩阵的列数: package org.admln. ...

  6. 使用sharepreferce记录数组数据

    使用sharepreferce记录数组数据 /** * * sharepreference纪录news数据 * * */ private static final String name=" ...

  7. MVC+jquery+AJAX的几种方式

    // 传过去一个简单值,获取一个简单值 $.ajax({ type: "GET", url: '<%= Url.Action("xx", "Co ...

  8. nodejs的mysql模块学习(八)关闭连接池

    关闭连接池 可以用pool.end()关闭连接池 pool.end(function (err) { // 所有的连接都已经被关闭 }); 当关闭之后pool将不可以getconnection()

  9. 12. Android框架和工具之 StringUtils(字符串操作)

    1. StringUtils介绍: StringUtils是apache commons lang库(http://commons.apache.org/proper/commons-lang/dow ...

  10. 沈逸老师PHP魔鬼特训笔记(4)

    上一课我们通过shell脚本拷贝代码,了解了静态方法和静态属性.(还有个附件PHAR包,我直接无视了) 然后在GOD文件中写了一些参数, 我们也可以这样,把方法名像拼凑字符串一样拼起来. $get_p ...