美文网首页iOS开发杂货铺UI
iOS 高度封装自适应表单(编辑及附件)

iOS 高度封装自适应表单(编辑及附件)

作者: SelwynBee | 来源:发表于2018-01-16 14:19 被阅读1295次

前段时间封装了简易的自适应表单系统,但是未能一并封装表单编辑以及添加附件功能。今天正好有时间,便把之前遗落的编辑以及附件功能加上,希望能为大家提供思路。

github地址(欢迎Star!):https://github.com/RockChanel/SelAttachmentForm

由于此版本封装较为仓促,最近针对此版本进行重构,去除了第三方的强依赖,可以根据需求引用,修复部分字段无效的问题,并将可定制化内容接口尽可能统一,详情请移步 iOS 高度封装自适应表单(重构版)

Form.gif

1. 表单条目类别

/** 表单cell类型 */
typedef NS_ENUM(NSInteger, SelwynFormCellType) {
    SelwynFormCellTypeNone = 0,     //default
    SelwynFormCellTypeInput = 1,    //单行或多行输入
    SelwynFormCellTypeTextViewInput = 2,    //包含textView输入
    SelwynFormCellTypeSelect = 3,   //选择
    SelwynFormCellTypeAttachment = 4,   //附件
};

2. 表单条目创建

/**
 快捷创建新增表单条目

 @param formTitle 标题
 @param formDetail 详情
 @param cellType cell类型
 @param keyboardType 键盘类型
 @param editable 是否可编辑
 @param required 是否必填(必选)
 @return 表单条目
 */
NS_INLINE SelwynFormItem *SelwynItemMake(NSString *formTitle, NSString *formDetail, SelwynFormCellType cellType, UIKeyboardType keyboardType, BOOL editable, BOOL required){
    return [SelwynFormHandle itemWithFormTitle:formTitle formDetail:formDetail cellType:cellType keyboardType:keyboardType editable:editable required:required];
}

/**
 快捷创建详情表单条目
 
 @param formTitle 标题
 @param formDetail 详情
 @param cellType cell类型
 @return 表单条目
 */
NS_INLINE SelwynFormItem *SelwynDetailItemMake(NSString *formTitle, NSString *formDetail, SelwynFormCellType cellType){
    return [SelwynFormHandle detailItemWithFormTitle:formTitle formDetail:formDetail cellType:cellType];
}

SelwynFormCellTypeInput:

SelwynFormItem *phoneNumber = SelwynItemMake(@"手机号", @"", SelwynFormCellTypeInput, UIKeyboardTypeNumberPad, YES, YES);
phoneNumber.maxInputLength = 11;    //添加字数限制

SelwynFormCellTypeTextViewInput:

SelwynFormItem *intro = SelwynItemMake(@"个人简介", @"", SelwynFormCellTypeTextViewInput, UIKeyboardTypeDefault, YES, NO);

SelwynFormCellTypeSelect:

SelwynFormItem *gender = SelwynItemMake(@"性别", @"", SelwynFormCellTypeSelect, UIKeyboardTypeDefault, NO, YES);
gender.selectHandle = ^(SelwynFormItem *item) { 
};

SelwynFormCellTypeAttachment:

SelwynFormItem *attachment = SelwynItemMake(@"附件", @"", SelwynFormCellTypeAttachment, UIKeyboardTypeDefault, YES, NO);

3. 编辑

//编辑按钮点击事件
self.editCompletion = ^(){
    [weakSelf.editBtn setTitle:@"完成" forState:UIControlStateNormal];
    name.editable = YES;  //重置可编辑属性
    name.required = YES;    //重置可选必选
    [weakSelf.formTableView reloadData];
};

4. 表单内容校验(可根据需求制定)

校验单个条目内容:

/** 校验表单内容 */
+ (SelwynFormItem *)checkContentWithItem:(SelwynFormItem *)item{
    
    item.formError = @"";
    if (item.required) {
        if (!item.formDetail || [item.formDetail isEqualToString:@""]) {
         
            if (item.formCellType == SelwynFormCellTypeInput || item.formCellType == SelwynFormCellTypeTextViewInput) {
                item.formError = [NSString stringWithFormat:@"请输入%@",item.formTitle];
                
            }else if (item.formCellType == SelwynFormCellTypeSelect){
                item.formError = [NSString stringWithFormat:@"请选择%@",item.formTitle];
            }
        }
    }
    return item;
}

校验整个表单:

/** 校验数据 */ 
- (void)commit{
    for (int sec = 0; sec < self.mutableArray.count; sec++) {
        SelwynFormSectionItem *sectionItem = self.mutableArray[sec];
        
        for (int row = 0; row < sectionItem.cellItems.count; row++) {
            
            SelwynFormItem *rowItem = sectionItem.cellItems[row];
            SelwynFormItem *checkItem = [SelwynFormHandle checkContentWithItem:rowItem];
            if (![checkItem.formError isEqualToString:@""]) {
                UIAlertView *alert = [[UIAlertView alloc]initWithTitle:checkItem.formError message:nil delegate:nil cancelButtonTitle:@"确定" otherButtonTitles: nil];
                [alert show];
                return;
            }
        }
    }
}

通过快捷添加条目的方式构建表单系统,大幅度提升表单开发效率,希望此表单系统能够对大家有所帮助。

相关文章

网友评论

  • jshto:不能设置cell高度啊
    SelwynBee:@jshto 不好意思,今天看了一下,是由于在计算cell高度时,没有使用到cellheight参数,可以稍作修改即可
  • jshto:defaultCellHeight 不生效,楼主看下呀
    jshto:@SelwynBee 我在SelwynFormItem.m defaultCellHeight着文件初始化的时候改变了高度,并不生效,您看下
    SelwynBee:@jshto 直接在文件里面修改即可啊
  • logan丶:开发中遇到这种表单提交可以说很恶心了。楼主提供了一套很好的思路,基于 tableView,但是如果需求是选择性别后,下面的输入内容需要发生变化呢(比如增加或减少几条输入框,输入框的名称变化等)?楼主的方法貌似就不太好解决了。
    logan丶:@SelwynBee 哇,是的呢,那确实是很方便了,感谢楼主
    SelwynBee:让数据源动态变化
    SelwynBee:只需要修改数据源的数组即可啊
  • xkx007:由于提交表单,必然会对应一个表单的详情查看,那个图片选择的cell,在不可编辑状态下,如何根据图片url来展示图片。最好还是提交cell和查看cell彼此对应的 封装一套UI,保证风格的一致。
    SelwynBee:@xkx007 查看详情url只需要images传url数组即可,在图片展示地方把SDWebImage语句放开就可以了
  • 朱朱001:标题的颜色是不是不能设置,默认是黑色的啊?
    朱朱001:@SelwynBi 看不太懂,怎么加的,指教一下
    SelwynBee:不过要自己加方法
    SelwynBee:可以在SelwynFormItem里进行配置
  • 朱朱001:怎么获取输入的内容和附件图片的地址呢?
    朱朱001:@SelwynBi 怎么设置标题的颜色啥的
    SelwynBee:输入内容直接用模型调用formDetail属性就可以了,附件也是直接调用images
  • 南巷旧人M:bug 是选择附件之后再输入文字,每输入一个文字附件图片闪烁一下,添加四张图片每删除一张,其他图片也是跟随闪烁一下!
    南巷旧人M:@SelwynBi 楼主牛逼
    SelwynBee:输入文字导致图片闪烁也已优化
    SelwynBee:文字展示不全问题已修复,闪烁是由于刷新的问题,后面会加以优化,感谢提出问题
  • 南巷旧人M:有bug, 当文字换行之后,删除文字,然后输入框变小,第一行文字不能全部显示!
  • 天寒地裂:给力啊!我这几天也是在做表单,感谢博主!!!

本文标题:iOS 高度封装自适应表单(编辑及附件)

本文链接:https://www.haomeiwen.com/subject/ttpsoxtx.html