关于填写信息形式的通用cell的思考

最近公司项目,经常会是这种界面:一个tableView,然后每个cell有负责一个数据,就像是网站注册用户时需要填写许多用户信息时的界面类似。但是这些cell又不是相同的,可以是既定的label,不可编辑,可以是需要输入的textField,也可能是button弹窗选择,还可能是UISwitch来选择。最后之所以要写文章总结下,是因为我觉得这种界面出现是有规律性的,并且我找到了一点很好写出这种界面的途径。

什么时候会出现这种界面需求呢?当你需要提交的数据是具有多个字段的,并且每一个都是需要用户进行输入的,关键就在于是用户输入的。类似用户信息完善、像51job上添加一个简历这种,当需要提交的东西本身具有多个属性,然后每个属性都需要用户输入的时候,就会是这种界面。像CSDN的编辑简介

看起来似乎很简单,但好像又不是那么简单。最开始遇到的问题就是:cell在划出屏幕再回来就内容消失了,这个问题总结写在另一篇里面了。

想想,最大的问题,其实是每个cell单独写还是使用一个通用的cell通过不同参数来实现不同的界面的问题。一开始我每个cell单独写,真是累死了(我是纯代码写界面的)。故事板里有静态tableview,但是不能为了单独一个界面用故事板吧,用xib可以写tableView的界面吗?拖一个tableView上来,设一个委托,然后没了,每个cell长啥样还是得代码写。最后总结,像这种填写信息的cell,类型是有限的,而且最关键的是基本一个cell负责一个内容,像上面的这张图,第一行是“昵称”和“实名”两个内容,在手机上估计会划分成两行,也就是两个cell里面。这个性质有什么好处呢?就是一个cell只有一个内容,这样可以给cell写一个获取内容的方法,cell就会根据自身的类型得到相应的text,比如:

-(NSString*)text{
    if (_type == textField) {
        return self.textField.text;
    }else if (_type == button){
        return self.button.titleLabel.text;
    }else if (_type == textView){
        return self.textView.text;
    }else if (_type == switchBtn){
        return self.switchBtn.on ? @"是":@"否";
    }else if (_type == label){
        return self.resultLabel.text;
    }
    return nil;
}

_type是一个枚举类型:

typedef enum{
    textField = 0,
    button,
    label,
    textView,
    switchBtn,
    inputNone
}contentType;

同样也可以设置text,就是所,你只需要直接使用cell.text = @"中国",cell自己就会去处理了,省去了重复的做判断,简化的感觉太爽了!

上面的枚举每个类型代表了一种cell的承载内容的方式,这样处理过后,这个cell就是一个抽象的更为通用的cell,就是把那些不同的cell全部归结到一种了。很多问题就变得简单了:1、设置字体可以统一设置   2、cell可以批量构建,比如:

-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier contentType:(contentType)type title:(NSString*)title text:(NSString*)text placeHolder:(NSString*)placeHolder indexPath:(NSIndexPath*)indexPath;

这是cell的init方法,然后准备好type数组、title数组,text数组等等,当然也可以把这些封装到一个数据类或者字典里,然后再装到数组里,然后根据indexPath取出每个cell需要的参数丢给这个init方法,其他的就不用管了。

当然,我觉得最方便的一点是在提交数据的时候:1、检查数据是否为空,每一项内容都写一遍检查,然后弹窗提示,想想都累,如果使用了通用的cell,那么就可以给cell写一个检查方法,比如

//提交时检测内容是否输入
-(BOOL)checkContent{
    //inputNone形式是没有内容输入,所以不做内容是否为空的检查
    if(!_isNeedCheck || _type == inputNone){
        return YES;
    }
    if (self.text == nil || [self.text isEqualToString:@""]) {
        NSString* alertText = nil;
        if (self.type == button) {
            alertText = [NSString stringWithFormat:@"请选择%@",_title];
        }else{
            alertText = [NSString stringWithFormat:@"请输入%@",_title];
        }
        [SVProgressHUD showErrorWithStatus:alertText];
        return NO;
    }
    return YES;
}

提交是只需要循环保存cell的数组,每个cell调用checkContent方法就好了。

2、数据提交时,比如构建json串,上面图里,肯定就是{“昵称”:@“XXX”,@"实名":@“YYY”,@“职位”:@“ZZZ”}这种形式,那么你需要取到每一个key,再取到对应的value,是不是累死了,如果这些都没有按规律放置(其实规律就是按顺序放进数组,或者按键值存进字典)。而如果使用了通用的cell,并且把这些cell存入了同一个数组,那么只需要循环下这个数组就可以了:

NSMutableDictionary* jsonDic = [NSMutableDictionary dictionary];
    for (int i = 0; i<_cellArray.count; i++) {
        TaskItemCustomCell* cell = [_cellArray objectAtIndex:i];
        [jsonDic setValue:cell.text forKey:cell.key];
    }

简单的不敢相信!cell.text就是cell上面的内容,cell会根据自身的类型获取对应的text,key是在cell构建的时候放进去的,这也是因为前面说的一个cell只负责一项内容,这样一个cell就对应着提交数据json字典里面的一项键值对。循环一下,把所有cell的内容和相应的键存进字典,一切搞定!

之所以可以这样做,就是这样的界面本身的性质决定,也是由tableView的性质决定的!

而且如果出现了一种新的内容输入形式,只需要给这个cell添加一种新类型就可以了,完全不影响原本的状态。

时间: 2024-08-24 10:26:03

关于填写信息形式的通用cell的思考的相关文章

PHP提交表单失败后保留已填写信息怎么实现?

PHP提交表单失败后如何保留已经填写的信息. PHP提交表单失败后如何保留填写的信息一些方法总结,其中最常用的就是使用缓存方式了,这种方法如果网速慢是可能出问题的,最好的办法就是使用ajax了.1.使用header头设置缓存控制头Cache-control.PHP代码:header('Cache-control: private, must-revalidate'); //支持页面回跳 2.使用session_cache_limiter方法.PHP代码:session_cache_limiter

超详细的php用户注册页面填写信息完整实例(附源码)

这篇文章主要介绍了一个超详细的php用户注册页面填写信息完整实例,内容包括邮箱自动匹配.密码强度验证以及防止表单重复等,小编特别喜欢这篇文章,推荐给大家. 注册页面是大多数网站必备的页面,所以很有必要对自己的注册页面做些精心的设计.下面三张图,第一张是注册的展示页面,第二张思维导图就一个简单的逻辑,第三张是通过firebug查看调用的JS文件. 一.给每个输入框写下说明 在用户看到这个输入框的时候,就能非常清晰的明白这个输入框是做啥用的,最大限度的降低他们产生疑惑的可能性.我们需要假设用户毫不了

填写信息的文章区域text_area

<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title></title> <style> textarea{ width: 500px; height: 300px; } </style> </head> <body> <textarea></textarea> </body&

如何使用PDF Reader在PDF表格上填写信息?

原文地址:https://blog.51cto.com/lander/2412569

基于SpringJDBC的类mybatis形式SQL语句管理的思考与实现

SpringJDBC为我们提供了一个非常方便的数据库访问接口,我们都知道使用JdbcTemplate对数据库进行操作时需要传入执行的SQL语句.在小型系统中,SQL语句可能并不会太多,这个时候我们无论采取什么方式进行管理都没有关系.但是当系统逐渐庞大后,我们就要考虑以一种恰当的方式对这些SQL进行管理了.我们将首先介绍比较常见的几种SQL管理方式,然后再讨论类mybatis形式的SQL管理方式. 在方法中直接构造并传入 这种方式是在需要执行数据库操作的方法内直接硬编码SQL语句.这样做的好处在于

文档型信息交互设计及相关技术实现

本文信息交互是指办公和经营管理活动中所产生的公众或定向业务信息,以及在信息共享过程中,以业务规则形式衍生出的评论.评价.回复.转发等业务信息延续. 信息交互设计目标 共享业务信息,并支持限定范围 共享的业务信息,可以通过评论.评价.回复.转发等方式进行业务信息延续和推广 把发布信息.延续信息功能设计为通用功能 以信息实例为基本文档单元,衍生信息为其子文档,存储在文档型数据库中(MongoDB) 信息展现形式灵活多样,以模板形式为用提供应用选择 发布信息支持带格式文档,统一采用MarkDown编辑

SharePoint 2013 图像呈现形式介绍

由于图像呈现形式依赖 SharePoint Server 2013 中的其他功能,因此需确保您满足本节中的先决条件,才能执行本文中的过程.先决条件包括: • 发布网站集 您要在其中添加图像呈现形式的网站集必须已事先使用发布门户或产品目录网站集模板进行创建.或者,您必须在要使用图像呈现形式的网站集上启用发布功能.有关详细信息,请参阅 TechNet 库中的发布到 Internet.Intranet 和 Extranet 网站的概述. • 配置的 BLOB 缓存 基于磁盘的 BLOB 缓存用于控制二

Delphi 的各种错误信息(中英文)

******************************* * 编 译 错 误 信 息 * ******************************* ';' not allowed before 'ELSE' ElSE前不允许有“;” '<clause>' clause not allowed in OLE automation section 在OLE自动区段不允许“<clause>”子句 '<name>' is not a type identifier

.net通用权限设计源码

经过一年多的设计编码和测试,公司通用权限系统对业务部门提供了比较稳定.便捷和灵活的支撑. 该系统分为两部分:配置界面和WCF服务. 界面:权限系统管理员可以通过配置界面的方式对各部门或者组织机构的人员进行业务权限分配操作. WCF服务:业务开发人员可以通过权限系统提供的接口服务,获取业务权限数据,对业务系统进行开发. 该设计的好处就是权限系统的可移植性更高,权限系统可以单独部署,发布对外的服务接口即可,和业务系统之间耦合性更低,从而达到设计模式的核心价值高内聚,低耦合. IIS部署示例如下: 权