JSON式开发项目中的静态TableView界面

卡布奇诺.jpg

前言

目前工作中正在维护的有三个项目、项目中充斥着大量的静态的界面。由于项目并没有采用storyboard而是使用的xib文件,所以没有办法直接使用storyboard自带的静态cell拖拽实现功能。静态TableView界面存在着功能复杂、样式多样、权限删减等复杂多变的操作。基本上每一个cell都所属独立功能、直接实现需要做大量的if或者Switch判断。故写了一个简单的通用的处理框架,规范此类页面的书写方式。

APP中静态界面一般包含有:

"我"、"设置"、"个人信息"、"通用"、"权限"、"隐私"、"消息通知"等模块。例如:微信、支付宝中此类页面大约有20个不同类型但均属于静态的界面。故而、需要提供规范写法、将通用代码封装起来,保证开发效率与代码整洁性。

示例图

  1. 微信


    微信部分示例图.png
  2. 支付宝


    支付宝部分示例图.png
框架实现效果
CommonTable.gif

实现原理

  • 封装UITableView的协议事件并剥离到单独类ZWCommonTableDelegate
  • 封装通用数据模型、允许用户配置Section、Cell模板、拓展信息等。
  • 允许用户自定义Cell、并提供协议方法。
  • 允许用户自定义Cell数据模型、提供协议绑定对应自定义Cell.
  • JSON式配置数据源、点击事件、Cell模板、快速实现页面。

核心代码解析

  • 为UITableView绑定封装好的协议,并提供数据模型
-(ZWCommonTableDelegate *)tableAdapter{
    if (!_tableAdapter) {
        _tableAdapter = [[ZWCommonTableDelegate alloc] initWithTableData:^NSArray *{
            return self.dataSourceArr;;
        }];
    }
    return _tableAdapter;
}
self.mTable.delegate = self.tableAdapter;
self.mTable.dataSource = self.tableAdapter;
  • JSON方式配置Model
-(void)setData{
    WeChatInfoModel *infoModel  = [[WeChatInfoModel alloc] init];
    infoModel.headerImage       = @"WechatIMG2";
    infoModel.name              = @"wang_ziwu";
    infoModel.weChatName        = @"KingWeChat";
    
    ZWStaticSwitchModel *msgValidModel = [[ZWStaticSwitchModel alloc] init];
    msgValidModel.title = @"消息验证";
    msgValidModel.actionSwitchName = @"actionSwitch:";

    ZWStaticSwitchModel *recommendModel = [[ZWStaticSwitchModel alloc] init];
    recommendModel.title = @"像我推荐通讯录朋友";
    
    self.dataSourceArr = @[
                           @{
                               SectionHeaderHeight   :headerHeight,
                               SectionFooterHeight   :footerHeight,
                               SectionRows           :@[
                                       @{
                                           IsHiddenAccessory    :@(NO),
                                           CellRowHeight        :@"100",
                                           CellExtraInfo        :infoModel
                                           }
                                       ]
                               },
                           @{
                               SectionHeaderHeight   :headerHeight,
                               SectionFooterHeight   :footerHeight,
                               SectionRows           :@[
                                       @{
                                           CellTitle            :@"微信事例一",
                                           CellImageName        :@"MoreMyAlbum_25x25_",
                                           CellPushVcClassName  :@"WeChatMineCtr",
                                           IsHiddenAccessory    :@(NO)
                                           },
                                       @{
                                           CellTitle            :@"微信事例二",
                                           CellImageName        :@"MoreMyFavorites_25x25_",
                                           CellActionSelName    :@"actionToExampCtr",
                                           IsHiddenAccessory    :@(NO)
                                           }
                                       ]
                               },
                           @{
                               SectionHeaderHeight   :headerHeight,
                               SectionFooterHeight   :footerHeight,
                               SectionRows           :@[
                                       @{
                                           CellTitle            :@"字体大小",
                                           CellDetailTitle      :@"小号字体",
                                           },
                                       @{
                                           CellTitle            :@"缓存大小",
                                           CellDetailTitle      :@"1000KB",
                                           CellActionSelName    :@"actionClearCach",
                                           IsHiddenAccessory    :@(NO)
                                           }
                                       ]
                               },
                           @{
                               SectionHeaderHeight   :headerHeight,
                               SectionFooterTitle    :@"开启后,为你推荐已经开通微信的手机联系人",
                               SectionFooterHeight   :@"50",
                               SectionRows           :@[
                                       @{
                                           CellExtraInfo        :msgValidModel
                                           },
                                       @{
                                           CellExtraInfo        :recommendModel
                                           }
                                       ]
                               },
                           @{
                               SectionHeaderHeight   :headerHeight,
                               SectionRows           :@[
                                       @{
                                           CellTitle            :@"退出",
                                           CellRowHeight        :@"40",
                                           CellClassName        :@"ZWStaticButtonCell",
                                           CellActionSelName    :@"actionExitLogin"
                                           }
                                       ]
                               },
                           ];
    self.dataSourceArr = [ZWCommonTableSection sectionsWithData:self.dataSourceArr];
}
  • 通用Cell事件绑定机制


    通用Cell事件绑定机制.png
    • CellClassName用来绑定自定义Cell,不赋值则默认使用UITableViewCell。
    • CellActionSelName用来绑定Cell点击事件。优先级最高,默认到主控制器中寻找相同方法名的事件并触发执行。
    • CellPushVcClassName配置直接Push的Controller。适用于通用Cell点击直接Push的类型。
    • SectionHeaderHeight、CellRowHeight、IsHiddenAccessory、CellImageName等基本配置宏都可以在通用数据模型中找到注释方法。
  • 自定义Cell模型数据事件绑定机制
    • 自定义ZWStaticOptionCell、ZWStaticOptionModel
    • 使用宏定义方法ZWConfigCellModel()绑定
      custCellModel.png

默认封装Cell类型、满足大部分APP静态界面

  • 系统默认UITableViewCell、可以直接JSON化赋值设置。


    默认类型.png
  • 开关按钮配置类型


    开关按钮配置类型.png
  • 普通按钮类型


    按钮类型.png
  • 单行文本输入框类型
  • 多行文本输入框类型


    单行/多行文本输入框.png

关于通用Cell数据全局化配置

//------------------------redmine-----------------------//
//配置cell基本默认值
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#define ZWCommonShareConfig     [ZWCommonConfig sharedConfig]
@interface ZWCommonConfig : NSObject
+ (instancetype)sharedConfig;
/** 
 *  cell 默认高度
 */
@property (nonatomic, assign) CGFloat commonCellHeight;
/** 
 *  title 字体大小
 */
@property (nonatomic, assign) CGFloat titleFontSize;
/** 
 *  detailTitle 字体大小
 */
@property (nonatomic, assign) CGFloat detailTitleFontSize;
/** 
 *  textView 内边距
 */
@property (nonatomic, assign)  UIEdgeInsets textContainerInset;
@end

通过单例类ZWCommonConfig可以全局化定制Cell的默认取值。

快速使用教程

  • 创建自定义控制器继承ZWCommonTableCtr
  • 重写父类方法、并绑定数据源即可。
//override
- (NSArray *)staticDataArray{
    return @[];
}

如何快速导入框架

强烈建议您使用pod导入,节省导入依赖的时间。

  • 使用cocoaPods导入(如果发现搜索不到,执行pod repo update --verbose命令更新本地spec缓存(可能需要几分钟),然后再搜索就可以了.)
pod 'ZWCommonTable', '~> 1.0.0'
  • 直接将文件ZWCommonTable拖入工程中
#import "ZWCommonTable.h"

多输入框UITableView的延伸

框架初期是为了实现RichCell模式界面、后面项目中发现有大量的信息录入界面、于是对框架进行升级改造、目前实现多输入模式也非常方便。可以参考Demo中多输入类型界面。接下来我会单独写一篇文章介绍如何快速完成"多输入模式"的界面。

源码

源码放在GitHub上,欢迎指正,记得star哦!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,475评论 4 372
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,744评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,101评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,732评论 0 221
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,141评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,049评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,188评论 2 320
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,965评论 0 213
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,716评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,867评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,341评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,663评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,376评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,200评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,990评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,179评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,979评论 2 279

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,112评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,598评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,650评论 4 59
  • 陋室空堂,当年笏满床。 衰草枯杨,曾为歌舞场。 蛛丝儿结满雕梁,绿纱今又在蓬窗上。 说甚么脂正浓、粉正香,如何两鬓...
    难思nan念阅读 152评论 0 0
  • 又是一天黄昏 夕阳的余晖自塔顶上方洒下 照亮空中流动的尘埃 下午六点半的气息 一切寂寥无声 少女在旋梯上看书 远...
    彩娃阅读 222评论 0 1