概述
基本上,每一款APP都有相应的设置模块。怎么设置才能更灵活和通用呢,这也是大家一直思考的。下面说说在网易彩票中,设置模块的设置思想。
基本上有三种方案:
- static cell(呆板,完全没有动态)
- 使用代码,条件判断逐个编写(麻烦,代码冗长)
- 使用plist加载(能够动态配置跳转控制器,不能配置请求代码;由于使用字符串配置跳转控制器名,容易出现运行时错误)
- 使用模型封装每个cell的数据(item),使用Class作为跳转控制器属性(这样就能经过编译检测)
最终我们使用的是第4种方式来实现,效果:
实现
思路:
1.创建cell的数据模型group(头部标题、尾部标题及items)
2.创建cell的数据模型item(图标、标题、block、跳转到控制器)
3.自定义cell,根据不同的item模型创建不同的cell外观(箭头、开头、文本等)
4.自定一个基类控制器,实现
- 加载解析group和item数据
- 根据group数据创建table的样式(组底部、组尾部)
- 加载自定义的cell
- 如果item类是跳转类型的,需要配置跳转目标控制器
- 如果item类是代码执行型的,需要配置要执行的block代码
5.设置界面实现基类控制器,只需要简单配置要显示的item
1.创建cell的数据模型group
MJSettingGroup.h
#import <Foundation/Foundation.h> @interface MJSettingGroup : NSObject /** 头部标题*/ @property (nonatomic, copy) NSString *header; /** 尾部标题*/ @property (nonatomic, copy) NSString *footer; /** 存放这组行的所有的模型*/ @property (nonatomic, copy) NSArray *items; @end
2.创建cell的数据模型item
单元Cell中有好几种类型:
- 开头
- 箭头
- 文本
因此,为了在界面上更容易区别,我们分别为这几个类型定义一个模型。当前,这几种类型的中,左边显示图标和不显示图标都是一样的,因此,定义一个单元Cell模型基类,其它都继续于这个基类。
(基类)MJSettingItem.h
#import <Foundation/Foundation.h> typedef void (^MJSettingItemOption)(); @interface MJSettingItem : NSObject /** 图标 */ @property (nonatomic, copy) NSString *icon; /** 标题 */ @property (nonatomic, copy) NSString *title; /** 点击cell要做的事情 */ @property (nonatomic, copy) MJSettingItemOption option; +(instancetype)itemWithIcon:(NSString *)icon title:(NSString *)title; +(instancetype)itemWithTitle:(NSString *)title; @end
(基类)MJSettingItem.m
#import "MJSettingItem.h" @implementation MJSettingItem +(instancetype)itemWithTitle:(NSString *)title { return [self itemWithIcon:nil title:title]; } +(instancetype)itemWithIcon:(NSString *)icon title:(NSString *)title { MJSettingItem *item = [[self alloc] init]; item.icon = icon; item.title = title; return item; } @end
MJSettingLabelItem(文本)、MJSettingSwitchItem(开关)、MJSettingArrowItem(箭头)都分别继承MJMJSettingItem
MJSettingArrowItem.h
#import "MJSettingItem.h" @interface MJSettingArrowItem : MJSettingItem /** * 点击这行cell需要跳转的控制器 */ @property (nonatomic, assign) Class destVcClass; + (instancetype)itemWithIcon:(NSString *)icon title:(NSString *)title destVcClass:(Class)destVcClass; + (instancetype)itemWithTitle:(NSString *)title destVcClass:(Class)destVcClass; @end
MJSettingArrowItem.m
#import "MJSettingArrowItem.h" @implementation MJSettingArrowItem + (instancetype)itemWithIcon:(NSString *)icon title:(NSString *)title destVcClass:(Class)destVcClass { MJSettingArrowItem *item = [self itemWithIcon:icon title:title]; item.destVcClass = destVcClass; return item; } + (instancetype)itemWithTitle:(NSString *)title destVcClass:(Class)destVcClass { return [self itemWithIcon:nil title:title destVcClass:destVcClass]; } @end
3.自定义cell
根据不同的item模型创建不同的cell外观(箭头、开头、文本等)
4.自定一个基类控制器,实现
- 加载解析group和item数据
- 根据group数据创建table的样式(组底部、组尾部)
- 根据不同的item模型创建不同的cell外观(箭头、开头、文本等)
- 如果item类是跳转类型的,需要配置跳转目标控制器
- 如果item类是代码执行型的,需要配置要执行的block代码
MJBaseSettingViewController.h
#import <UIKit/UIKit.h> @interface MJBaseSettingViewController : UITableViewController @property (nonatomic, strong) NSMutableArray *data; @end
时间: 2024-12-08 12:03:08