我正在创建一个测试类应用程序。用户需要在UITextField中输入的地方。因此,我必须检查以下条件:
Like "0123456789$")。$应该只出现一次,而且在任何数字之后也是如此。这意味着用户不能从$开始输入。$之后,如果用户将提供任何数字输入,那么我必须显示弹出式,就像“数字格式不正确”。这是我的代码:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool{
//Solution for 1st condition
let inverseSet = NSCharacterSet(charactersIn:"0123456789$").inverted
let components = string.components(separatedBy: inverseSet)
let filtered = components.joined(separator: "")
if filtered == string {
return true
} else {
if string == "." {
let countdots = textField.text!.components(separatedBy:".").count - 1
if countdots == 0 {
return true
}else{
if countdots > 0 && string == "." {
return false
} else {
return true
}
}
}else{
return false
}
}
}
//Solution for 2nd condition
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.locale = Locale.current
formatter.maximumFractionDigits = 0
if let groupingSeparator = formatter.groupingSeparator {
if string == groupingSeparator {
return true
}
if let textWithoutGroupingSeparator = textField.text?.replacingOccurrences(of: groupingSeparator, with: "") {
var totalTextWithoutGroupingSeparators = textWithoutGroupingSeparator + string
if string == "" { // pressed Backspace key
totalTextWithoutGroupingSeparators.characters.removeLast()
}
if let numberWithoutGroupingSeparator = formatter.number(from: totalTextWithoutGroupingSeparators),
let formattedText = formatter.string(from: numberWithoutGroupingSeparator) {
textField.text = formattedText
return false
}
}
}
return true
}
}如何在UITextField shouldChangeCharactersIn方法中设置多个条件。请帮助我实现这一目标。谢谢!
发布于 2018-05-14 11:10:26
最好创建两个验证方法,从这两个条件返回true/false,然后检查是否为true,然后只继续或给出正确的消息。
func validationCase1(text:String) -> Bool {
// validate scenario 1.
return isValidated.
}
func validateCase2(text:String) -> Bool {
// validate scenario 2.
return isValidated.
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
var isValidatedFirst = validateCase1(string);
var isValidatedSecond = validateCase2(string);
if(isValidatedFirst == isValidatedSecond == true){
// pass
}
else if(isValidatedFirst == false){
// show message for first
}
else if(isValidatedSecond == false){
// show message for second
}
}发布于 2018-05-14 12:05:27
我无法理解你的第二点,但其余的事情可以很容易地通过使用简单的正则表达式来实现。下面是一个示例:
private func regexMatch(string: String, pattern: String) -> Bool {
if let range = string.range(of: pattern, options: .regularExpression) {
let subString = string[range]
if subString == string {
return true
}
}
return false
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let result = (textField.text as NSString?)?.replacingCharacters(in: range, with: string) ?? string
if regexMatch(string: result, pattern: "[0-9]+\\$*[0-9]*") || result.count == 0 {
if regexMatch(string: result, pattern: "[0-9]+\\${0,1}") == false && result.count != 0 {
print("Number format is incorrect")
}
return true
} else {
return false
}
}此代码段将只接受数字和“$”作为UITextField的输入。“$”不能是第一个字符,在“$”之后的任何数字都将导致要打印的错误消息。
我希望这能给你足够的清晰度来定制它来满足你的需要。
更新:
限制用户在“$”之后输入任何内容,并且只执行一次“$”替换
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool使用
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let result = (textField.text as NSString?)?.replacingCharacters(in: range, with: string) ?? string
if regexMatch(string: result, pattern: "[0-9]+\\${0,1}") || result.count == 0 {
return true
} else {
return false
}
}https://stackoverflow.com/questions/50328589
复制相似问题