美文网首页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