在Swift中停止重复小数点分隔符

时间:2016-07-21 17:46:17

标签: ios swift xcode

我已经构建了一个复利计算器应用程序。应用程序几乎运行,现在我想防止重复。在文本字段中。

我已经完成了以下三件事,但它并没有阻止用户输入超过1个小数点分隔符:

  1. 使该类符合UITextFieldDelegate
  2. 将文本字段的委托属性连接到视图控制器
  3. 为principal,interest,freq,years文本字段添加了以下函数:

    func principal(principal: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    
        let existingTextHasDecimalSeparator = principal.text?.rangeOfString(".")
        let replacementTextHasDecimalSeparator = string.rangeOfString(".")
    
        if existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil {
            return false
        }
        else {
            return true
        }
    }
    
    func interest(interest: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    
        let existingTextHasDecimalSeparator = interest.text?.rangeOfString(".")
        let replacementTextHasDecimalSeparator = string.rangeOfString(".")
    
        if existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil {
            return false
        }
        else {
            return true
        }
    }
    
    func freq(freq: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    
        let existingTextHasDecimalSeparator = freq.text?.rangeOfString(".")
        let replacementTextHasDecimalSeparator = string.rangeOfString(".")
    
        if existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil {
            return false
        }
        else {
            return true
        }
    }
    
    func years(years: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    
        let existingTextHasDecimalSeparator = years.text?.rangeOfString(".")
        let replacementTextHasDecimalSeparator = string.rangeOfString(".")
    
        if existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil {
            return false
        }
        else {
            return true
        }
    }
    
  4. 感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

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

不符合协议。

你必须完全匹配完整的签名(名称很重要):

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

您需要使用一个并根据VC中的文本字段检查textField参数,以查看哪个更改了(如果您有不同的行为)。

由于上面的四个函数看起来完全相同,您可以确保始终引用参数而不是实现中的特定文本字段。

答案 1 :(得分:0)

此代码不起作用:

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

根据Apple的文档,此方法返回一个NSRange结构,给出第一次出现aString时接收器的位置和长度。如果找不到aString或为空(@“”),则返回{NSNotFound,0}。

因此,您需要检查不存在的范围

,而不是检查nil
if existingTextHasDecimalSeparator != NSNotFound && replacementTextHasDecimalSeparator != NSNotFound{}