为什么replaceCharacters更改文本字段中的文本所必需的?
我可以根据我在文本字段中输入的内容,使用以下代码行来改变我在文本字段中显示数字的方式。但是我甚至无法在我的代码的第二个版本中输入数字。为什么replaceCharacters更改文本字段中的文本所必需的?
为什么
[let oldText = textField.text! as NSString
var newText = oldText.replacingCharacters(in: range, with: string)]
是必要的吗?
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let oldText = textField.text! as NSString
var newText = oldText.replacingCharacters(in: range, with: string)
var newTextString = String(newText)
let digits = CharacterSet.decimalDigits
var digitText = ""
for c in (newTextString?.unicodeScalars)! {
if digits.contains(UnicodeScalar(c.value)!) {
digitText.append("\(c)")
}
}
// Format the new string
if let numOfPennies = Int(digitText) {
newText = "$" + self.dollarStringFromInt(numOfPennies) + "." + self.centsStringFromInt(numOfPennies)
} else {
newText = "$0.00"
}
textField.text = newText
return false
}
func textFieldDidBeginEditing(_ textField: UITextField) {
if textField.text!.isEmpty {
textField.text = "$0.00"
}
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true;
}
func dollarStringFromInt(_ value: Int) -> String {
return String(value/100)
}
func centsStringFromInt(_ value: Int) -> String {
let cents = value % 100
var centsString = String(cents)
if cents < 10 {
centsString = "0" + centsString
}
return centsString
}
如果我像这样改变它,它不再工作。
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
var newText = textField.text
let digits = CharacterSet.decimalDigits
var digitText = ""
for c in (newText?.unicodeScalars)! {
if digits.contains(UnicodeScalar(c.value)!) {
digitText.append("\(c)")
}
}
// Format the new string
if let numOfPennies = Int(digitText) {
newText = "$" + self.dollarStringFromInt(numOfPennies) + "." + self.centsStringFromInt(numOfPennies)
} else {
newText = "$0.00"
}
textField.text = newText
return false
}
textField(_:shouldChangeCharactersIn:replacementString:)
被称为之前的文本替换文本字段中的。此方法用于获取新文本,然后用textField.text
访问。
如果您只是想在更换发生后运行逻辑,请注意名为.UITextFieldTextDidChange
的通知。
NotificationCenter.default.addObserver(self, selector: #selector(textFieldTextDidChange), name: .UITextFieldTextDidChange, object: textField)
func textFieldTextDidChange() {
print(textField.text)
}
“shouldChangeCharactersIn”在文本字段被修改之前调用。由于您的代码总是返回false,因此无论用户输入(或粘贴)的内容都不会更新该字段的内容,除非您自己做。
在第二个版本中,您完全忽略了用户的输入,所以您的字段值永远不会改变。
让我们一部分回答。
1)方法replacingCharacters(in: range, with: string)
不是必需的。此方法将替换与指定范围匹配的子字符串。因此,与苹果文档根据:
stringByReplacingCharactersInRange:withString:
返回其在接收器的指定范围内的字符由给定的字符串替换一个新的字符串
2)代码更改无效的真正原因是返回值false
。尝试返回true
并且更改将会起作用。无论何时设置文本字段text
属性,方法textField:shouldChangeCharactersIn:replacementString:
都将被调用(因为它的委托被分配)。返回false
你告诉程序它不应该替换字符。
UPDATE
尝试使用UIControl事件Value Changed
作为@IBAction代替textField:shouldChangeCharactersIn:replacementString:
这将很好地工作。
观测数据:对不起,我的英语
如果shouldChangeCharactersIn方法直接更新文本字段的文本,那么它必须返回false。 – rmaddy
@rmaddy谢谢你有什么想法为什么第一个版本使用.replacingCharacters方法来改变文本?我的意思是有很多方法可以在不使用额外的行的情况下更改文本字段中的文本。使用它有什么好处吗? –
@willianPoliciano谢谢!在改变返回值后,它适用于第二个版本。但仍然有一个问题,看看你能否帮助我。我在回复rmaddy时解决了这个问题 –