WASHD 0.1.4

WASHD 0.1.4

测试已测试
Lang语言 SwiftSwift
许可 MIT
发布最新发布2016年8月
SPM支持 SPM

Andrew Goodwin 维护。



WASHD 0.1.4

WASHD - 苹果应该做的

为您的 UITextFields 添加验证、文本过滤、最大长度和文本字段顺序的最简单方法

最佳部分是您不需要子类化 UITextField–这是通过扩展实现的

需求

  • ARC
  • iOS 8

安装

WASHD 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中

pod "WASHD"

使用方法

界面构建器

IB

必需代码

支持 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
}

过滤 UITextField

如果是使用验证,那么它是内置的!

(例如,将验证类型设置为“.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-“

或者,您可以使用“shouldAllow(String…)”添加自己的

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
}

待办事项

  • [x] 添加字符过滤
  • [ ] 添加更多有用的提示以支持多个验证类型
  • [ ] 将代码更新到Swift 3

请随时提出拉取请求,并添加更多常用验证

示例

要运行示例项目,首先克隆存储库,然后从示例目录中运行 pod install

作者

Andrew Goodwin, [email protected] :)

许可

WASHD 在MIT许可下可用。有关更多信息,请参阅LICENSE文件。