GPSMaskTextField 2.0.0

GPSMaskTextField 2.0.0

Gilson Santos 维护。



  • Gilson Santos

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。

criando um UITextField

  • 其次,只需将自定义类GPSMaskTextField分配给您的UITextField

atribuindo a classe customizada

  • 第三,导入GPSMaskTextField并创建IBOutlet
import GPSMaskTextField

criando o Outlet

@IBOutlet weak var textField: GPSMaskTextField!

仅此而已就足够您使用Interface Builder中可用的所有基本验证功能。使用GPSMaskTextField,您甚至不必将委托分配给ViewController,这已经自动完成。

但如果你更喜欢自行实现UITextField的委托,你可以按照常规方式在ViewController中做到,这会自动成为优先级。

  • 在Interface Builder中,我们有以下配置

Configurações

  • 自定义掩码:作为示例使用的掩码
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)。

  • 主分隔符:当字段为货币类型时使用,在“是否货币”中的千位上使用的字符。

  • 十进制分隔符:当字段为货币类型时使用,在十进制位上配置的“是否货币”中使用的字符。

用法示例

Configurações

输出

"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]