iOS Delegate 以防止无效输入

标签 ios swift delegates

我正在学习 iOS 开发,并试图阻止 UITextField 的值具有多个十进制值,例如“45.3.1”和字母字符。

阻止字母字符功能未按我的预期运行。如果我在文本字段中输入数字时打印 alphabeticString 我得到 nil 但是当我在输入诸如“a”之类的字符时打印 alphabeticString我得到一个可选范围。出于某种原因,即使 alphabeticString 打印为 nil,我的 if 语句总是在插入字符时返回 true。

有什么原因吗?谢谢。

func textField(textField: UITextField,
        shouldChangeCharactersInRange range: NSRange,
        replacementString string: String) -> Bool {

    let existingTextHasDecimalSeperator = textField.text?.rangeOfString(".")
    let replacementTextHasDecimalSeparator = string.rangeOfString(".")
    let alphabeticString = string.rangeOfCharacterFromSet(NSCharacterSet.letterCharacterSet())

    if existingTextHasDecimalSeperator != nil && replacementTextHasDecimalSeparator != nil && alphabeticString != nil {
        return false
    }
    else {
        return true
    }
}

最佳答案

嗯,我不确定为什么它不起作用。为什么不为您的 textfield 使用“Decimal Pad”键盘类型?

如果出于某种原因你不想这样做,试试这个:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    switch string {
    case "0","1","2","3","4","5","6","7","8","9":
        return true
    case ".":
        if let _ = textField.text?.rangeOfString("."){
            return false
        }else{
            return true
        }
    default:
        if let _ = string.rangeOfCharacterFromSet(NSCharacterSet.letterCharacterSet()){
            return false
        }

        return true
    }
}

编辑:我想我在你的代码中发现了问题,你需要将 if 语句分成两个条件:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    let existingTextHasDecimalSeperator = textField.text?.rangeOfString(".")
    let replacementTextHasDecimalSeparator = string.rangeOfString(".")
    let alphabeticString = string.rangeOfCharacterFromSet(NSCharacterSet.letterCharacterSet())

    if (existingTextHasDecimalSeperator != nil && replacementTextHasDecimalSeparator != nil) ||  alphabeticString != nil {
        return false
    }
    else {
        return true
    }
}

关于iOS Delegate 以防止无效输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37870049/

相关文章:

ios - 在应用程序内登录 iCloud

ios - UIWebView 从后台返回后在 iOS 7 上更改 contentSize

objective-c - 从 subview 调用 View Controller 中的方法

ios - XCTAssertThrows 在断点处停止

ios - Swift - 在 iOS 中查找 4 位整数的反对数

ios - 将 UIWebView 迁移到 WKWebView

ios - 通过深层链接打开 View Controller 时导航栏消失

javascript - 为什么不委托(delegate)滚动工作?

c# - 如何像在 C# 中一样在 Java 中使用委托(delegate)?

wcf - 订阅 WCF 服务中的事件