【问题标题】:How can I limit the size of the year entered on the text field [duplicate]如何限制在文本字段中输入的年份大小[重复]
【发布时间】:2017-12-22 14:32:39
【问题描述】:

我正在尝试为信用卡到期日期创建一个文本字段并使用以下代码。

    if range.length > 0 {
        return true
    }
    if string == "" {
        return false
    }
    if range.location > 6 {
        return false
    }
    var originalText = textField.text
    let replacementText = string.replacingOccurrences(of: " ", with: "")

    if !CharacterSet.decimalDigits.isSuperset(of: CharacterSet(charactersIn: replacementText)) {
        return false
    }

    if range.location == 4 {
        originalText?.append("/")
        textField.text = originalText
    }
    return true

但是,使用该代码用户可以编写 5145/52,这对于到期日期是不正常的。如何将年份限制在 2000 到 2018 和月份值 01 到 12 之间?

【问题讨论】:

  • 发布提取此代码的整个方法。 (这是取自 textField(_:shouldChangeCharactersIn:replacementString:) 方法吗?)
  • 在我的 viewDidLoad 方法中,我正在调用以下函数 expiryField.addTarget(self, action: #selector(textField(_:shouldChangeCharactersIn:replacementString:)), for: .editingDidBegin)
  • 顺便说一句,您为什么要将年份限制在 2018 年?年份范围应该是从当前年份到 50 年后的范围。
  • @AtalayAsa 您将年份和月份集中到一个文本字段中是否有原因?
  • 我不会写答案,因为从技术上讲这不是,但我强烈建议您使用选择器进行此类输入,这样您就可以控制一切并自动减少工作量

标签: ios swift uitextfield date-format


【解决方案1】:

通常,输入文本的格式和验证是两个独立的问题。这是一个使用NSRegularExpression 的好地方。这里有一个日期验证示例,其中年份在 2000-2099 范围内,月份在 01-12 之间。

func validate(string: String) -> Bool {
    let regex = try! NSRegularExpression(pattern: "^(20)\\d\\d[/](0[1-9]|1[012])$")

    return regex.firstMatch(in: string, options: [], range: NSMakeRange(0, string.characters.count)) != nil
}

validate(string: "2012/02") // true
validate(string: "2012/2")  // false
validate(string: "1912/12") // false
validate(string: "2012/112") // false

更新:

在你的情况下,它看起来像这样:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard let text = textField.text else { return true }
    let newLength = text.count + string.count - range.length
    let characterSet = CharacterSet(charactersIn: string)

    if text.characters.count == 4, !string.characters.isEmpty {
        textField.text = text + "/"
    }

    return CharacterSet.decimalDigits.isSuperset(of: characterSet) && newLength <= 7
}

func textFieldDidEndEditing(_ textField: UITextField) {
    guard let text = textField.text else { return }
    let isUserInputValid = validate(string: text)

    if !isUserInputValid {
        //TODO: Notify user that expiration date is invalid
    }
}

【讨论】:

  • 那么你是说在我的 (_:shouldChangeCharactersIn:replacementString:) 中我应该调用该验证函数吗?
  • 检查我的编辑 :) 验证可以在不同的地方进行,这取决于您的需要。
  • 我试过了,效果很好,谢谢。但是,该 textFieldDidEndEditing 函数适用于我的所有文本字段,它导致了一个问题,因为我也有用户写入项目价格的价格文本字段。因为他们在同一个班级,所以他们两个使用相同的 textFieldDidEndEditing 函数,我怎样才能将它们彼此分开?
  • 您可以简单地检查 textField 参数是否等于特定的 textField:if let text = textField.text, textField == expirationDateTextField { //Validate expiration date }
猜你喜欢
  • 2019-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
  • 2013-10-23
  • 1970-01-01
  • 2022-01-18
  • 2019-05-10
相关资源
最近更新 更多