GPSMaskTextField
GPSMaskTextField 是一个适用于 UITextField 的框架,它有助于开发表单,而无需开发者担心字段所需的基本验证。
该框架使用反射来处理验证,通过简单而实用的方式,只需少量代码即可在 ViewController 中验证所有文本字段。
要求
- iOS 10.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+
- Xcode 10.2+
- Swift 5+
安装
CocoaPods
CocoaPods 是 Cocoa 项目的依赖项管理器。有关使用和安装说明,请访问其网站。要使用 CocoaPods 将 GPSMaskTextField 集成到您的 Xcode 项目中,请在您的 Podfile
中指定它。
pod 'GPSMaskTextField', '~> 2.0.0'
用法
- 首先,您必须在Interface Builder中创建一个UITextField。
- 其次,只需将自定义类GPSMaskTextField分配给您的UITextField
- 第三,导入GPSMaskTextField并创建IBOutlet
import GPSMaskTextField
@IBOutlet weak var textField: GPSMaskTextField!
仅此而已就足够您使用Interface Builder中可用的所有基本验证功能。使用GPSMaskTextField,您甚至不必将委托分配给ViewController,这已经自动完成。
但如果你更喜欢自行实现UITextField的委托,你可以按照常规方式在ViewController中做到,这会自动成为优先级。
- 在Interface Builder中,我们有以下配置
自定义掩码
:作为示例使用的掩码
1 - (##) #### - ####
2 - #### %
3 - ####### @gmail.com
掩码可以是一系列字符、空格等。#表示用户将输入文本的位置。
使用自定义掩码的最好之处在于,为了方便开发者获取分配给UITextField的值,GPSMaskTextField有一个函数,如以下示例所示,它返回用户输入的值而无需去掉掩码,从而无需再进行替换以获取此值。
let valueString = textField.getTextWithoutMask()
为了适应反向场景,例如当开发者需要从持久化API或层返回值时,这种结构已经提供了一种非常简单的方法,可以使用“updateTextWithMask”属性在文本中添加构建器界面中配置的掩码,并将要插入的文本分配给该属性。
self.textField.updateTextWithMask = yourText
使用“updateTextWithMask”属性为某个或所有文本字段分配值后,可以调用“forceValidation()”函数,负责验证所有字段是否满足“isRequired”字段中设置的规则,并触发委托来告知所有字段是否全部有效或无效。
有关验证字段对象更多详情,请参阅下面的主题。
self.textField.updateTextWithMask = yourText
...
self.validationFields.forceValidation()
最小大小
:字段所需的最小字符数。最大大小
:字段所需的最大字符数。
如果填写了自定义掩码字段,则这两项将自动与设置的大小写入掩码。
TextField名称
:友好名称,用于所有字段的验证选项(说明如下),如果返回无效字段,则使用此友好名称;如果开发者想将其用于消息展示,则该项为空时,将默认使用声明的@IBOutlet名称。
class ViewController: UIViewController, GPSValidationFieldsDelegate {
@IBOutlet weak var emailTextField: GPSMaskTextField!
func allFieldsValid() {
print("=== ALL VALID")
}
func notValidAllFields(fildesNotValid: [FieldsValidation]) {
fildesNotValid.forEach({print($0.name)})
}
}
//Optional("emailTextField")
-
是否货币
:确定字段是否为货币类型,如果是,则在“主分隔符和十进制分隔符”中填写。默认情况下,此值关闭(false)。 -
主分隔符
:当字段为货币类型时使用,在“是否货币”中的千位上使用的字符。 -
十进制分隔符
:当字段为货币类型时使用,在十进制位上配置的“是否货币”中使用的字符。
用法示例
输出
"1.200,00"
"76.454.500,00"
是否必需
:该配置确定字段是否强制用于所有字段的验证功能,如以下“验证所有字段”选项中所述。
验证所有字段
GPSMaskTextField有一个验证类,如果通过反射实例化,将负责该字段配置的所有验证,并通知其控制器所有字段是否有效或无效,如“字段验证的委托”部分中所述。
要使用自动验证功能,只需调用"ValidationFields()"类的实例,调用其"validationAllFields()"函数,在第一个参数中指定哪个类拥有要验证的GPSMaskTextField对象,在第二个参数中指出将实现"GPSValidationFieldsDelegate"的代理,如下例所示:
自动验证只重置已启用"Is Required"的"ON"字段。具有"OFF"选项的字段将正常应用掩码,但不会考虑此额外验证。
import UIKit
import GPSMaskTextField
class ViewController: UIViewController {
@IBOutlet weak var textField1: GPSMaskTextField!
@IBOutlet weak var textField2: GPSMaskTextField!
@IBOutlet weak var textField3: GPSMaskTextField!
private let validationField = ValidationFields()
override func viewDidLoad() {
super.viewDidLoad()
validationField.validationAllFields(for: self, delegate: self)
}
}
extension ViewController : GPSValidationFieldsDelegate {
func allFieldsValid() {
// All fields are valid
}
func notValidAllFields(fildesNotValid: [FieldsValidation]) {
// Reports all fields that have not yet met your validation
}
}
函数参数"notValidAllFields(fieldsNotValid: [FieldsValidation])"是一个返回信息和自身GPSMaskTextField对象的struct数组的数组。
public struct FieldsValidation {
var validIsRequired = false // If the field is required
var name = "" // Friendly name configured in Interface Builder or if nothing is filled, it defaults to the declared @IBOutlet name for textField
var errorValidation: ErrorValidateMask = .none // Enum with type of error in validation
var textField = GPSMaskTextField() // TextField field object
}
您可以在任何时候轻松地将非必填字段"isRequired = false"改为必填,只需将属性值更改为"isRequired = true"即可。
进行此更改时,ValidationFields类会将字段添加到您的待验证字段列表中,并重新执行所有验证,以确保更改后验证能正确进行。
@IBAction func click(_ sender: Any) {
self.emailTextField.isRequired = true
self.nameTextField.isRequired = false
}
字段验证代理
要使用"ValidationFields"类提供的自动验证功能,您必须实现"GPSValidationFieldsDelegate",并且可以选择实现"GPSKeyboardDelegate"以特定捕获键盘显示和隐藏。
// Required to capture validation events
public protocol GPSValidationFieldsDelegate: NSObjectProtocol {
func allFieldsValid()
func notValidAllFields(fildesNotValid: [FieldsValidation])
}
// Optional for capturing keyboard display or hiding
@objc public protocol GPSKeyboardDelegate: NSObjectProtocol {
@objc optional func showKeyboard(notification: Notification)
@objc optional func hideKeyboard(notification: Notification)
}
更新掩码
要动态更改在构建器界面中已定义的掩码,只需为特定字段实现代理"GPSMaskTextFieldDelegate",并具有其"updateMask"函数,如下例所示:
public protocol GPSMaskTextFieldDelegate: NSObjectProtocol {
func updateMask(textField: UITextField, textUpdate: String) -> String?
}
示例
import UIKit
import GPSMaskTextField
class ViewController: UIViewController {
@IBOutlet weak var textField1: GPSMaskTextField!
@IBOutlet weak var textField2: GPSMaskTextField!
@IBOutlet weak var textField3: GPSMaskTextField!
...
override func viewDidLoad() {
super.viewDidLoad()
...
self.textField1.gpsDelegate = self
}
}
//MARK: - DELEGATE GPSMASKTEXTFIELDDELEGATE -
extension ViewController: GPSMaskTextFieldDelegate {
func updateMask(textField: UITextField, textUpdate: String) -> String? {
guard self.textField1 == textField else { return nil } // Treatment performed if there is more than one delegate implementation
if textUpdate.count > 21 {
return "+ ## (##) ##### - ####"
}
return "+ ## (##) #### - ####"
}
}
实现此代理,每次调用updateMask函数都会更新每个字符。
致谢
首先,感谢上帝,感谢我的家人对我的支持,尤其是他们的理解,以及我的朋友们从最初至今的帮助和支持。特别感谢我的朋友们Tomaz Correa,Vitor Maura,Millfford Bradshaw。感谢你们大家。
鸣谢
GPSMaskTextField 由 Gilson Santos 开发([email protected])