我已经构建了一个复利计算器应用程序。应用程序几乎运行,现在我想防止重复。在文本字段中。
我已经完成了以下三件事,但它并没有阻止用户输入超过1个小数点分隔符:
为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
}
}
感谢任何帮助!
答案 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}。
因此,您需要检查不存在的范围
,而不是检查nilif existingTextHasDecimalSeparator != NSNotFound && replacementTextHasDecimalSeparator != NSNotFound{}