WASHD 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
pod "WASHD"
支持 UITextField “跳跃顺序”
override func viewDidLoad() {
super.viewDidLoad()
self.findAllTextInputs() //find all text inputs in the view controller for jump order process
}
func textFieldDidBeginEditing(textField: UITextField) {
self.currentjumpOrder = textField.jumpOrder //set current jump order
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
self.moveNext() //move to the next text input in order
return true
}
“跳跃顺序”指 UITextFields 在按“返回”按钮时接受第一响应者的顺序(类似于网页开发中的tab顺序)
跳跃顺序也适用于 UITextView
支持最大长度、文本过滤和文本格式
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
if textField.reachedMaxLength(range, string: string) || !string.shouldAllow(textField.allowedCharacters){
return false
}
return textField.formatText(string)
}
即使您没有在 UITextField 上设置格式,您也可以使用“textField.formatText(string)”。它将简单地返回 true。
在表单提交前进行验证(验证您想要验证的每个 UITextField)
let result = txtCreditCard.validate() //returns ValidationResult (see below)
if result.isValid
{
print(result.transformedString)
}
else
{
print(result.failureMessage)
}
验证结果
class ValidationResult
{
var isValid = false
var failureMessage : String? = nil
var transformedString : String = ""
//...
}
内置验证类型
case None = -1
case Zip = 0
case StreetAddress = 1
case Phone = 2
case Email = 3
case IPAddress = 4
case MACAddress = 5
case GPSCoordinate = 6
case GPSPoint = 7
case URL = 8
case CreditCard = 9
case Money = 10
case Letters = 11
case LettersWithSpaces = 12
case AlphaNumeric = 13
case AlphaNumericWithSpaces = 14
case PositiveNumbers = 15
case NegativeNumbers = 16
case WholeNumbers = 17
case PositiveFloats = 18
case NegativeFloats = 19
case Floats = 20
case Text = 21
case SSN = 22
case States = 23
case Name = 24
txtCreditCard.validationType = .CreditCard
txtCreditCard.format = "xxxx xxxx xxxx xxxx"
txtCreditCard.maxLength = 19
txtCreditCard.jumpOrder = 1
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
{
if textField.reachedMaxLength(range, string: string)
return false
}
return true
}
(例如,将验证类型设置为“.Zip”(即txtZip.validationType = .Zip)的文本字段将会有txtZip.allowedCharacters设置为下面的Zip常量)
只需将此代码添加到“…shouldChangeCharactersInRange…”UITextField代理方法中…
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
{
if !string.shouldAllow(textField.allowedCharacters)
return false
}
return true
}
UITextField预定义字符串
let UpperCaseLetters = "ABCDEFGHIJKLKMNOPQRSTUVWXYZ"
let LowerCaseLetters = "abcdefghijklmnopqrstuvwxyz"
let AllLetters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ"
let UpperCaseHex = "0123456789ABCDEF"
let LowerCaseHex = "0123456789abcdef"
let AllHex = "0123456789abcdefABCDEF"
let PositiveWholeNumbers = "0123456789"
let WholeNumbers = "-0123456789"
let PositiveFloats = "0123456789."
let Floats = "-0123456789."
let Email = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789_-+@.%"
let Street = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789 -#.&"
let IPAddress = "0123456789."
let Money = "0123456789.$"
let Phone = "0123456789.()- "
let Zip = "0123456789-“
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
{
return string.shouldAllow(Numbers, "@#$") // you can enter several different strings of characters to allow
}
let zip = ValidationExpression(expression: "^\\d{5}(-\\d{4})?$", description: "Zip Code",failureDescription: "Invalid Zip Code”)
…然后将其程序性地应用到UITextField
txtZip.validationExpression = zip
let zip = ValidationExpression(expression: "^\\d{5}(-\\d{4})?$", description: "Zip Code",failureDescription: "Invalid Zip Code", hints: [
ValidationRule(priority: 1, expression: "\\d{5}", failureDescription: "Zip code must be 5 characters"),
ValidationRule(priority: 0, expression: "[0-9]+", failureDescription: "Not numbers"),
],transformText:
{ (zipcode) in
var myString = zipcode
myString = myString?.stringByReplacingOccurrencesOfString(" ", withString: "")
return myString!
}
,furtherValidation:nil)
4242 4242 4242 4243 是一个通过正则表达式检查的信用卡号码。然而,进一步的验证执行了一个 Luhn 检查,所有信用卡都必须通过(您可以在此处阅读更多:[Luhn算法](https://en.wikipedia.org/wiki/Luhn_algorithm))。
进一步的验证闭包以转换后的文本作为参数,并返回一个验证结果对象
注意 condensedWhitespace是一个辅助变量,用于移除在IB中用户错误输入时的多个相邻空格
let creditCard = ValidationExpression(expression: "^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11})$",
description: "Debit or Credit Card",
failureDescription: "Invalid card",
hints: [ValidationRule(priority: 0, expression: "\\d+", failureDescription: "Missing Numbers")],
transformText:
{ (card) in
var myString = card
myString = myString?.condensedWhitespace.stringByReplacingOccurrencesOfString(" ", withString: "")
return myString!
},
furtherValidation:{[weak self] (card) in
if (self?.luhnTest(card))!
{
return ValidationResult(isValid: true, failureMessage: nil, transformedString: card)
}
else
{
return ValidationResult(isValid: false, failureMessage: "Card failed Luhn check", transformedString: card)
}
})
func luhnTest(number: String) -> Bool
{
let noSpaceNum = number.condensedWhitespace
let reversedInts = noSpaceNum.characters.reverse().map{
Int(String($0))
}
return reversedInts.enumerate().reduce(0, combine: {(sum, val) in let odd = val.index % 2 == 1
return sum + (odd ? (val.element! == 9 ? 9 : (val.element! * 2) % 9) : val.element!)
}) % 10 == 0
}
要运行示例项目,首先克隆存储库,然后从示例目录中运行 pod install
。
Andrew Goodwin, [email protected] :)
WASHD 在MIT许可下可用。有关更多信息,请参阅LICENSE文件。