美文网首页iOS开发宝典为了更好的活着ios实用开发技巧
iOS 高度封装自适应表单SWForm (重构版)

iOS 高度封装自适应表单SWForm (重构版)

作者: SelwynBee | 来源:发表于2018-05-31 17:17 被阅读476次

    前言

    前段时间封装了一个自适应表单框架,但是由于时间仓促,没有加以完善优化,导致其中有部分字段无效以及也有提出关联的第三方框架较多等问题,所以产生了重构的想法。

    此版本舍弃了原有第三方的强关联,并将所有字段逐一重新配置。在提供了原有功能的基础上,新增了 单位 以及 字数显示 功能。同时也提供了相关API,方便使用。如果有任何问题或建议,可以留言评论或私信我。

    Github 地址: iOS 高度封装自适应表单SWForm (重构版) 【欢迎 Star 】

    SWForm.gif

    一、项目下载

    在 Github 上的项目提供了 SWForm 实际使用中的示例 SWFormDemo 以及 SWForm 框架。在实际使用中,只需要将 SWForm 文件夹导入项目中即可使用。

    二、表单条目 SWFormItem

    1)条目类别 SWFormItemType

    SWForm 中共支持四种表单条目类型:

    typedef NS_ENUM(NSInteger, SWFormItemType) {
        /**
         表单条目可单行或多行输入(标题居左)
         */
        SWFormItemTypeInput = 0,
        /**
         表单条目可选择(标题居左)
         */
        SWFormItemTypeSelect = 1,
        /**
         表单条目可多行输入(标题居上)
         */
        SWFormItemTypeTextViewInput = 2,
        /**
         表单条目包含图片选择
         */
        SWFormItemTypeImage = 3,
    };
    

    以上四种类型基本上可支持大部分表单系统结构(若有不满足的,可留言评论)。

    2)标题样式 SWTitleShowType

    同时针对于必填(必选)标题样式,框架中也提供了三种表单条目标题样式:

    /**
     必选条目标题呈现形式类别
     */
    typedef NS_ENUM(NSInteger, SWTitleShowType) {
        /**
         默认呈现形式,如: 标题(必填)
         */
        SWTitleShowTypeDefault,
        /**
         标题前部加红色*,如: *标题
         */
        SWTitleShowTypeRedStarFront,
        /**
         标题后部加红色*,如: 标题*
         */
        SWTitleShowTypeRedStarBack,
        /**
         仅显示标题
         */
        SWTitleShowTypeOnlyTitle,
    };
    

    由于在项目中,标题样式基本保持一致,所以单独设置了全局的标题样式,可根据自身需求选择不同的标题样式。

    // 表单标题显示类别
    NSInteger const SW_TitleShowType = SWTitleShowTypeRedStarFront;
    
    3)条目创建方式

    为方便用户快捷构建表单条目,SWForm 提供了两种表单条目快捷构建函数,以便快捷构建新增以及详情表单条目:

    /**
     SWFormItem_Add 快捷构建新增表单条目
    
     @param title 标题
     @param info 详情
     @param itemType 条目类别
     @param editable 是否可编辑
     @param required 是否必填
     @param keyboardType 键盘类别
     */
    FOUNDATION_EXPORT SWFormItem *SWFormItem_Add(NSString *title, NSString *info, SWFormItemType itemType, BOOL editable, BOOL required, UIKeyboardType keyboardType);
    
    /**
     SWFormItem_Info 快捷构建详情表单条目
     */
    FOUNDATION_EXPORT SWFormItem *SWFormItem_Info(NSString *title, NSString *info, SWFormItemType itemType);
    
    4)条目单位类别 SWFormItemUnitType

    对于表单中可能出现的金额、年限等条目,此版本也提供了单位自动添加功能。主要有以下几种单位类别:

    typedef NS_ENUM(NSInteger, SWFormItemUnitType) {
        /**
         无单位
         */
        SWFormItemUnitTypeNone = 0,
        /**
         元
         */
        SWFormItemUnitTypeYuan,
        /**
         年
         */
        SWFormItemUnitTypeYear,
        /**
         自定义单位
         */
        SWFormItemUnitTypeCustom,
    };
    

    表单条目单位类别默认为 SWFormItemUnitTypeNone, 即无单位。表单框架中已经定义了常用的单位,例如:元、年等。防止有未涉及到的单位,同时提供了单位自定义,自定义单位类别为 SWFormItemUnitTypeCustom

    /**
     条目附带单位
     */
    @property (nonatomic, copy) NSString *unit;
    

    可以根据需求,设置 unit 属性的值,以达到单位自定义的目的。

    5)输入字数显示

    SWFormItemTypeTextViewInput 类型的表单条目可通过 showLength 添加输入字数显示。

    /**
     是否显示当前字数
     只在 SWFormItemTypeTextViewInput 类型下有效,若无最大字数限制,则只显示字数; 若有字数限制,则显示 "当前字数/最大字数"
     */
    @property (nonatomic, assign) BOOL showLength;
    

    三、表单 section 条目 SWFormSectionItem

    表单 section 条目可根据需求将不同条目划分到不同的section中,并提供了 sectionHeader 和 sectionFooter 方便用户指定自定义界面。

    与表单条目类似,SWForm 也提供了 SWFormSectionItem 的快捷构建函数:

    /**
     SWSectionItem 快捷构建表单section条目
    
     @param items 表单section包含的条目集合
     */
    FOUNDATION_EXPORT SWFormSectionItem *SWSectionItem(NSArray *items);
    

    四、API 说明

    由于舍弃了原先使用的第三方框架,以方便用户根据需求自行定制,故 SWForm 提供了多个API,用户可以 SWFormDemo 中示例为参考,实现个性化定制。

    SWForm 主要提供了三个 API 文件,分别为 UIImageView+FormImageSWFormImageCell+ImageHandleSWFormHandler

    UIImageView+FormImage 提供了表单图片条目中图片 URL 加载 API,可以在此函数中实现如 SDWebImage 以实现图片URL加载:

    /**
     图片附件条目图片加载
    
     @param url 图片加载的url
     */
    - (void)sw_setImageItemWithUrl:(NSURL *)url;
    

    SWFormImageCell+ImageHandle 提供了表单图片条目中图片添加 API 以及图片预览 API,使用者可以在此 API 中添加自定义图片选择以及图片预览功能:

    /**
     选择图片数据回调
     
     @param maxImages 最大可选择图片数
     @param currentImages 当前选择图片数
     @param completion 选择图片数组回调
     */
    - (void)sw_selectImageWithMaxImages:(NSInteger)maxImages currentImages:(NSInteger)currentImages completion:(void(^)(NSArray *selectImages))completion;
    
    /**
     图片浏览
    
     @param images 图片数组
     @param currentIndex 当前浏览的index
     */
    - (void)sw_photoBrowserWithImages:(NSArray *)images currentIndex:(NSInteger)currentIndex;
    

    SWFormHandler 为数据校验文件,提供了相机权限、相册权限以及表单空数据校验功能:

    /**
     必选(必填)数据空数据校验,可根据需求定制
    
     @param datas 表单数据源
     @param success 必选(必填)数据全部校验成功
     @param failure 必选(必填)数据某一项校验失败
     */
    + (void)sw_checkFormNullDataWithWithDatas:(NSArray *)datas success:(void(^)(void))success failure:(void(^)(NSString *error))failure;
    
    /**
     校验是否有相机权限
     */
    + (void)sw_checkCameraAuthorizationStatusWithGrand:(void(^)(BOOL granted))permissionGranted;
    
    /**
     校验是否有相册权限
     */
    + (void)sw_checkAlbumAuthorizationStatusWithGrand:(void(^)(BOOL granted))permissionGranted;
    

    五、使用说明

    在使用 SWForm 快捷构建表单时,只需提供表单数据源即可,跟根据表单层级动态添加数据源。SWFormDemo 示例中添加了 SWForm 的新增表单、详情表单、提交以及编辑功能的示例,具体使用,请参考 SWFormDemo

    不忘初心,方得始终。希望尽笔者微薄之力,可以对大家有所帮助。

    Github 地址: iOS 高度封装自适应表单SWForm (重构版)

    相关文章

      网友评论

      • buguys:这个表单里的内容需要提交到数据库该怎么办呢
        SelwynBee:@buguys 直接取数据存就行,不同数据库写法不一样
        buguys:提交到数据库的格式是 <SWFormItem: 0x6040000e2c80>
      • 8c7f71888754:你好,我现在遇到一个问题,我用简介那一块,但是我不知道如何捕捉他的输入框的字数变化的方法,还有就是, 如果是选性别的时候,设置了isEble但是没有用,这个bug我不知道您有没有注意到,要不就是我使用的方法有误,QQ 1927813567 ,希望你看到加一下我
      • 8c7f71888754:我这边有一个问题就是我这边把你的demo拿过来,然后在点击性别的时候崩溃了,加QQ1927813567 ,挺多问题的,一个一个评论不太方便
      • 8c7f71888754:如果有两个区的话要怎么写数据呢,看demo里面只有一个区
        SelwynBee:@欧阳木森 再添加一个sectionItem就行了
      • jshto:很好用的表单库,感谢。如果每行能自定义添加多个输入就好了,还有就是如果能获取SWFormItem对象的所在View就好了,这样就能自己添加许多自定义的View和交互。
        SelwynBee:请问 每行能自定义添加多个输入 是什么意思

      本文标题:iOS 高度封装自适应表单SWForm (重构版)

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