UITextFieldDelegate的shouldChangeCharactersIn方法 - 为什么不能组合条件语句检查小数点分隔符和字母

问题描述:

为什么我的replacementTextHasLetter不会阻止我粘贴到我的文本字段中的字母与下面的条件?UITextFieldDelegate的shouldChangeCharactersIn方法 - 为什么不能组合条件语句检查小数点分隔符和字母

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

    let existingTextHasDecimalSeparator = textField.text?.range(of: ".") 
    let replacementTextHasDecimalSeparator = string.range(of: ".") 

    let charactersNotAllowed = NSCharacterSet.letters 
    let replacementTextHasLetter = string.rangeOfCharacter(from: charactersNotAllowed) 

    if existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil && replacementTextHasLetter != nil { 

     return false 

    } 

    return true 

} 

但是,当它有自己独立的条件它的作品?

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

    let existingTextHasDecimalSeparator = textField.text?.range(of: ".") 
    let replacementTextHasDecimalSeparator = string.range(of: ".") 

    let charactersNotAllowed = NSCharacterSet.letters 
    let replacementTextHasLetter = string.rangeOfCharacter(from: charactersNotAllowed) 

    if existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil { 

     return false 

    } 

    if replacementTextHasLetter != nil { 

     return false 

    } 

    return true 

} 

编辑:我想通了。第一个示例不可能工作,因为existingTextHasDecimalSeparator & replacementTextHasDecimalSeparator基本上是确定文本字段中是否存在小数,并且用户是否尝试输入新的字符以返回false。当我添加

&& replacementTextHasLetter != nil 

到条件,它只是没有真正服务于一个目的,因为所有的语句不能同时为真。谢谢@sonofabeach

+1

把它放在它自己的'if'条件下使它成为一个“或”('||'),而不是“和”。您正在使用'&&',而不是'||'。你真的想要哪个? –

+0

为什么不能成为“AND”? – tophst

+0

它可以。它可以是任何你想要的。但是不要指望“AND”的表现与“OR”相同。你的问题是(为了解释我的理解)......为什么你发布的两个代码块表现不一样?答案是,其中一个明确地使用“AND”来组合条件('&&'),另一个隐含地等同于使用“OR”来组合条件。 “AND”和“OR”的行为非常不同。如果答案不够,那么你可能需要更多地澄清这个问题。 –

这两条线:

if existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil { 
    return false 
} 

if replacementTextHasLetter != nil { 
    return false 
} 

是有效的一样:

if (existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil) || replacementTextHasLetter != nil { 
    return false 
} 

注意使用||代替&&的最后一个条件。