• Stars
    star
    320
  • Rank 131,126 (Top 3 %)
  • Language
    Swift
  • License
    MIT License
  • Created over 3 years ago
  • Updated over 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

TableView 表单

效果图

image

特点:

1、提供基础表单样式,也可以自定义
2、可对输入的文本进行验证
3、cell可以根据输入的文本长度,进行高度的自适应
4、cell的不同样式,只需要根据ZJJFormModel对象进行配置即可

表单用到的枚举:

enum ZJJFormCellStyle  {
    case `default`
    case option
    case value1
    case value2
    case input1
    case input2
    case textView1
    case textView2
    case customIdentifier(String) //自定义Cell的identifier
   
    func cellIdentifier() -> String {
        switch self {
        case .option:
            return kZJJFormTextViewOneCellIdentifier
        case .value1:
            return kZJJFormValueOneCellIdentifier
        case .value2:
            return kZJJFormValueTwoCellIdentifier
        case .input1:
            return kZJJFormInputOneCellIdentifier
        case .input2:
            return kZJJFormInputTwoCellIdentifier
        case.textView1:
            return kZJJFormTextViewOneCellIdentifier
        case.textView2:
            return kZJJFormTextViewTwoCellIdentifier
        case .customIdentifier(let identifier):
            return identifier
        default:
            return kZJJFormValueOneCellIdentifier
        }
    }
}

enum ZJJFormRequiredType {
    case none //非必须
    case required //必须
    case requiredAndStar //必须带红星
}

enum ZJJFormInputReturnDoneType {
    case none //
    case hiddenKeyboard //隐藏键盘
    case next //进入下一个输入框
}

enum ZJJFormInputErrorType {
    case none //不显示
    case line //显示下横线 ,就是横线变色
    case label //显示错误的信息
    case lineAndLabel //显示错误的信息和横线变色
}


enum ZJJFormInputVerifyType {
    case none 
    case editing //编辑的过程中进行验证,验证不通过,显示错误提示(可以继续输入)
    case stopEditing //编辑的过程中进行验证,验证不通过,禁止输入
    case endEdit //编辑结束后,在进行验证,验证不通过,显示错误提示
}

表单文本基础设置对象

struct ZJJFormText {
    
    var requiredType = ZJJFormRequiredType.none //是否必填
    var key:String = ""  //左边或上边文本
    var value:String = "" //右边值或者输入的
    var serviceKey:String = "" //后台字段key,方便通过serviceKey值,取对应的值
}

表单Cell的UI样式对象

struct ZJJFormUI {
    var cellHeight:CGFloat = UITableView.automaticDimension //默认使用表格动态布局
    var cellSpace:CGFloat = 0 //cell与tableView两边的边距,左右的边距相等
    var isShowArrow:Bool = false //是否显示箭头>
    var isHiddenLine:Bool = false // 是否隐藏分割线,默认false
    var lineLeftMargin:CGFloat = kZJJFormUIMargin //分割线与左边的边距
    var lineHeight:CGFloat = 0.5 //分割线的高度
    var lineRightMargin:CGFloat = kZJJFormUIMargin //分割线与右边的边距
    var separatorLineColor:UIColor = UIColor(red: 0.42, green: 0.41, blue: 0.47,alpha:0.3)// 分割线颜色
    var errorFont:UIFont = .systemFont(ofSize: 12) //错误提示的字体大小
    var errorColor:UIColor = UIColor.red//错误的时候,错误提示的文本或线条的颜色
    var starColor:UIColor = UIColor.red //🌟的颜色
    var lineBreakMode :NSLineBreakMode = .byCharWrapping
    var keyTextColor:UIColor = .black //左边文本颜色
    var valueTextColor:UIColor = .black //右边边文本颜色
    var keyTextFont:UIFont = .systemFont(ofSize: 16) //左边文本字体的大小
    var valueTextFont:UIFont = .systemFont(ofSize: 16)  //右边文本字体的大小
    var placeholderColor:UIColor = UIColor(red: 0.42, green: 0.41, blue: 0.47,alpha:0.5)  //输入框的placeholder字体颜色
    var placeholderFont:UIFont = .systemFont(ofSize: 14)  //输入框的placeholder字体的大小
    var inputTextAlignment:NSTextAlignment = .right //输入框的文本对齐样式
}

如何使用

1、创建ZJJFormModel对象,根据功能来设置model的对象(文本的是ZJJFormBaseModel对象,输入框的是ZJJFormInputModel对象,选项的是ZJJFormOptionModel对象)

class ZJJFormModel{
    var cellStyle:ZJJFormCellStyle = .default //cell的样式
    var model:ZJJFormBaseModel
    init(cellStyle:ZJJFormCellStyle,model:ZJJFormBaseModel) {
        self.cellStyle = cellStyle
        self.model = model
    }
}

2、对象的创建

1)、文本显示,创建ZJJFormBaseModel对象

class ZJJFormBaseModel : NSObject,ZJJFormBlockBaseProtocol {
    var formSelectCellBlock: ZJJFormBaseBlock?
    func formSelectCell(block:@escaping ZJJFormBaseBlock)  {
        self.formSelectCellBlock = block
    }
    var valueType:Int = 0 //自定义标识
    var param:[String:Any?] = [:] //自定义携带的参数
    var formText:ZJJFormText = ZJJFormText()
    var formUI:ZJJFormUI = ZJJFormUI() //UI样式
}

2)、输入框显示,创建ZJJFormInputModel对象,其中verify属性是验证类

class ZJJFormInputModel: ZJJFormBaseModel,ZJJFormBlockInputProtocol {
    
    var formValueBeginEditingBlock: ZJJFormInputBlock?
    var formValueChangeBlock: ZJJFormInputBlock?
    var formValueDidEndEditBlock: ZJJFormInputBlock?
    var formValueReturnBlock: ZJJFormInputBlock?
    func formValueBeginEditing(block: @escaping ZJJFormInputBlock) {
        self.formValueBeginEditingBlock = block
    }
    func formValueChange(block:@escaping ZJJFormInputBlock)  {
        self.formValueChangeBlock = block
    }
    func formValueDidEndEdit(block:@escaping ZJJFormInputBlock)  {
        self.formValueDidEndEditBlock = block
    }
    func formValueReturn(block: @escaping ZJJFormInputBlock) {
        self.formValueReturnBlock = block
    }
    var maxLength:Int = 255
    var isScrollEnabled:Bool = false //textView,当文字超过视图的边框时,是否允许滑动
    var keyboardType: UIKeyboardType = .default //输入键盘类型
    var returnKeyType:UIReturnKeyType = .default //return键的类型
    var returnDoneType:ZJJFormInputReturnDoneType = .none //设置点击return,要做的事,支持隐藏键盘和跳转到下一个输入框
    var placeholder:String = "" //输入框占位文本
    var verify:ZJJFormVerify = ZJJFormVerify() //校验输入框的类
    var isConsecutiveSpaces:Bool = false //是否连续空格,如果连续两个空格以上,会导致多出一个点代替空格
    var inputAccessoryView:UIView? //键盘上的工具栏
}
class ZJJFormVerify {
    var errorType:ZJJFormInputErrorType = .none //显示出错的信息类型
    var isBeginEnditingHiddenError:Bool = true //如果有错误提示,是否开始的编辑的时候就隐藏错误提示,true表示隐藏,false表示显示
    var errorMsg:String? //错误的信息提示
    fileprivate(set)   var type:ZJJFormInputVerifyType = .none //验证类型,在什么情况下进行验证
    var verifyValueBlock:ZJJFormInputVerifyValueBlock? //验证回调
    
    init(type:ZJJFormInputVerifyType = .none,errorMsg: String? = nil, verifyValueBlock:ZJJFormInputVerifyValueBlock? = nil){
        self.errorMsg = errorMsg
        self.type = type
        self.verifyValueBlock = verifyValueBlock
    }
}

3)、选项显示,创建ZJJFormOptionModel对象,可以结合ZJJPopup来使用,ZJJPopup的具体使用GitHub地址

class ZJJFormOptionModel:ZJJFormInputModel {
    var option:ZJJOption = ZJJOption()
}

3、表单的UItableView建议使用ZJJFormTableView或者ZJJFormBaseTableView,设置表单的数据源dataArray

4、参数的组装和验证,可以使用ZJJFormParam

struct ZJJFormParam {
    var isValid:Bool = false //全部的验证是否通过
    var firstErrorMsg:String? //第一个错误的信息提示语
    var param:[String:Any?] = [:] //组装的参数
    var filterArray:[ZJJFormModel] = [] //筛选出来的对象
    init(dataArray:[ZJJFormSectionModel],errorType:ZJJFormInputErrorType = .lineAndLabel,filterServiceKeys:[String] = [],filterValueTypes:[Int] = [])
}

自定义cell

1、文本显示,继承ZJJFormBaseCell,并调用以下方法

   func setFormBaseCellSubView(keyLabel:UILabel?,valueLabel:UILabel? = nil)

2、UITextField的显示,继承ZJJFormTextFieldBaseCell,并调用以下方法

func setFormTextFieldCellSubView(keyLabel:UILabel?,textField:UITextField? = nil,errorLabel:UILabel? = nil)

3、UITextView的显示,继承ZJJFormTextViewBaseCell,并调用以下方法

func setFormTextViewCellSubView(keyLabel:UILabel?,textView:UITextView? = nil,errorLabel:UILabel? = nil)

4、选项的显示,可以继承ZJJFormTextFieldBaseCell或者ZJJFormTextViewBaseCell来进行自定义, 建议继承ZJJFormTextViewBaseCell,这样可以直接使用placeholder,需要设置textView的isEditable和isUserInteractionEnabled属性为false