固定字符计数、十进制计数和;0“;swift中的字符计数

固定字符计数、十进制计数和;0“;swift中的字符计数,swift,uikit,Swift,Uikit,运行此代码时,只能插入一次“.”。如果它已经在一个文本字段中,我不能在另一个文本字段中使用另一个“.”,这与字符计数相同。如果在一个文本字段中输入8个字符,则不能在任何其他文本字段中输入任何字符 func textField(_ textField: UITextField, shouldChangeCharactersIn range:NSRange, replacementString string: String) -> Bool { // cost

运行此代码时,只能插入一次“.”。如果它已经在一个文本字段中,我不能在另一个文本字段中使用另一个“.”,这与字符计数相同。如果在一个文本字段中输入8个字符,则不能在任何其他文本字段中输入任何字符

func textField(_ textField: UITextField, shouldChangeCharactersIn range:NSRange, replacementString string: String) -> Bool {    
            // cost of materials
        if (costOfMaterialsTXT.text?.contains("."))! && string == "." {
                return false
        }
            // tech hours
        if (techHoursTXT.text?.contains("."))! && string == "." {
            return false
        }
            // helper hours
        if (helperHoursTXT.text?.contains("."))! && string == "." {
                return false
        }
        //Prevent "0" characters as the first characters
        
            // cost of materials
        if (costOfMaterialsTXT.text == "0" && string.isEmpty)  {

                return true
        } else if (costOfMaterialsTXT.text == "0" && string != ".") {
                return false
        }
            // tech hours
        if (techHoursTXT.text == "0" && string.isEmpty)  {
            return true
        
        } else if (techHoursTXT.text == "0" && string != ".") {
            return false
        }
            // helper hours
        if (helperHoursTXT.text == "0" && string.isEmpty)  {

                return true
        } else if (helperHoursTXT.text == "0" && string != ".") {
                    return false
        }

        //Limit the character count to 8
            
            // cost of materials
        if ((costOfMaterialsTXT.text!) + string).count > 8 {
                return false
        }
            // tech hours
        if ((techHoursTXT.text!) + string).count > 8 {
            return false
        }
            // helper hours
        if ((helperHoursTXT.text!) + string).count > 8 {
                return false
        }

        // Only Numbers And Decimal-Point Allowed
        let allowedCharacters = "0123456789."
        let allowedCharacterSet = CharacterSet(charactersIn: allowedCharacters)
        let typedCharactersSet = CharacterSet(charactersIn: string)

        return allowedCharacterSet.isSuperset(of: typedCharactersSet)
    }
这是最小分解

您可以在开始时检查它是否是具有该行为的
UITextField
之一。读取
textField
参数。 您对每个
UITextField
执行相同的操作,因此您不应该关心
材料成本xt
techHoursTXT
,也不必关心
helperHoursTXT
,而是这些
UITextField
中的任何一个

现在,关于代码本身

如果您只有这3个,则可以在开始时卸下防护罩。
您应该在此处正确展开
textField.text?.contains(“.”)
textField.text。如果
string
是“/”(例如,从复制/粘贴中)并且您希望能够在每个文本字段中只放置一次“.”怎么办?如果是,请读取委托方法的
textField
参数。它会让你知道当前正在编辑的是哪一个,所以你不应该关注其他的。是的,这是正确的,一旦计算发生,它会将其转换为货币格式,因此如果有多个“.”,它将崩溃,即1..2而不是1.2谢谢你这非常有帮助,它解决了我的问题!!它已经被阻止了复制和粘贴,但仍然无法进入编码,您解释这一点的方式现在完全有意义了
func textField(_ textField: UITextField, shouldChangeCharactersIn range:NSRange, replacementString string: String) -> Bool {    

    guard [costOfMaterialsTXT, techHoursTXT, helperHoursTXT].contains(textField) else { 
        return true //It's another textfield, is it even possible? Do you have more textField?
    }
    
    if (textField.text?.contains("."))! && string == "." {
        return false
    }
    //Prevent "0" characters as the first characters
    if (textField.text == "0" && string.isEmpty)  {
        return true  
    } else if (textField.text == "0" && string != ".") {
        return false
    }
    
    //Limit the character count to 8
    if ((textField.text!) + string).count > 8 {
        return false
    }
    
    let allowedCharacters = "0123456789."
    let allowedCharacterSet = CharacterSet(charactersIn: allowedCharacters)
    let typedCharactersSet = CharacterSet(charactersIn: string)
    
    return allowedCharacterSet.isSuperset(of: typedCharactersSet)
}