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