首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在UITextField shouldChangeCharactersIn中设置Swift3 iOS中的多个条件

如何在UITextField shouldChangeCharactersIn中设置Swift3 iOS中的多个条件
EN

Stack Overflow用户
提问于 2018-05-14 10:54:12
回答 2查看 687关注 0票数 0

我正在创建一个测试类应用程序。用户需要在UITextField中输入的地方。因此,我必须检查以下条件:

  1. 限制用户只使用数字和$ (Like "0123456789$")。
  2. 在textfield中添加逗号。
  3. 在textfield值中,$应该只出现一次,而且在任何数字之后也是如此。这意味着用户不能从$开始输入。
  4. $之后,如果用户将提供任何数字输入,那么我必须显示弹出式,就像“数字格式不正确”。

这是我的代码:

代码语言:javascript
复制
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方法中设置多个条件。请帮助我实现这一目标。谢谢!

EN

回答 2

Stack Overflow用户

发布于 2018-05-14 11:10:26

最好创建两个验证方法,从这两个条件返回true/false,然后检查是否为true,然后只继续或给出正确的消息。

代码语言:javascript
复制
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
 }
}
票数 0
EN

Stack Overflow用户

发布于 2018-05-14 12:05:27

我无法理解你的第二点,但其余的事情可以很容易地通过使用简单的正则表达式来实现。下面是一个示例:

代码语言:javascript
复制
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的输入。“$”不能是第一个字符,在“$”之后的任何数字都将导致要打印的错误消息。

我希望这能给你足够的清晰度来定制它来满足你的需要。

更新:

限制用户在“$”之后输入任何内容,并且只执行一次“$”替换

代码语言:javascript
复制
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool

使用

代码语言:javascript
复制
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
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50328589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档