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;

}

 

 

 

 

 

 

posted on 2016-05-08 00:23  li仲玄  阅读(829)  评论(0编辑  收藏  举报

导航