![](/img/trans.png)
[英]Using `textField:shouldChangeCharactersInRange:`, how do i found that characters are mismatch?
[英]Using `textField:shouldChangeCharactersInRange:`, how do I get the text including the current typed character?
我正在使用下面的代码尝试更新textField2
的文本内容以匹配textField1
每当用户输入textField1
。
- (BOOL) textField: (UITextField *)theTextField shouldChangeCharactersInRange: (NSRange)range replacementString: (NSString *)string {
if (theTextField == textField1){
[textField2 setText:[textField1 text]];
}
}
但是,我观察到的输出是......
textField2 为“12”,当 textField1 为“123”时
textField2 为“123”,当 textField1 为“1234”时
...当我想要的是:
textField2 为“123”,当 textField1 为“123”时
当 textField1 为“1234”时,textField2 为“1234”
我究竟做错了什么?
-shouldChangeCharactersInRange
在文本字段实际更改其文本之前被调用,这就是您获得旧文本值的原因。 要在更新后获取文本,请使用:
[textField2 setText:[textField1.text stringByReplacingCharactersInRange:range withString:string]];
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString * searchStr = [textField.text stringByReplacingCharactersInRange:range withString:string];
NSLog(@"%@",searchStr);
return YES;
}
根据接受的答案,以下内容应该适用于Swift 3 :
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let newString = NSString(string: textField.text!).replacingCharacters(in: range, with: string)
return true
}
String
和NSString
都有称为replacingCharacters:inRange:withString
。 然而,正如预期的那样,前者需要一个Range
实例,而后者需要一个NSRange
实例。 textField
委托方法使用NSRange
实例,因此在这种情况下使用NSString
。
不要使用 UITextFieldDelegate,而是尝试使用 UITextField 的“Editing Changed”事件。
在 Swift(4) 中,没有NSString
(纯 Swift):
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if let textFieldString = textField.text, let swtRange = Range(range, in: textFieldString) {
let fullString = textFieldString.replacingCharacters(in: swtRange, with: string)
print("FullString: \(fullString)")
}
return true
}
作为扩展:
extension UITextField {
func fullTextWith(range: NSRange, replacementString: String) -> String? {
if let fullSearchString = self.text, let swtRange = Range(range, in: fullSearchString) {
return fullSearchString.replacingCharacters(in: swtRange, with: replacementString)
}
return nil
}
}
// Usage:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if let textFieldString = textField.fullTextWith(range: range, replacementString: string) {
print("FullString: \(textFieldString)")
}
return true
}
Swift 版本:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
if string == " " {
return false
}
let userEnteredString = textField.text
var newString = (userEnteredString! as NSString).stringByReplacingCharactersInRange(range, withString: string) as NSString
print(newString)
return true
}
这是你需要的代码
if ([textField isEqual:self.textField1])
textField2.text = [textField1.text stringByReplacingCharactersInRange:range withString:string];
使用警卫
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
guard case let textFieldString as NSString = textField.text where
textFieldString.stringByReplacingCharactersInRange(range, withString: string).length <= maxLength else {
return false
}
return true
}
我的解决方案是使用UITextFieldTextDidChangeNotification
。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(copyText:) name:UITextFieldTextDidChangeNotification object:nil];
不要忘记调用[[NSNotificationCenter defaultCenter] removeObserver:self];
在dealloc
方法中。
如果您需要用这个替换文本字段文本,您可以使用我的解决方案(Swift 3): https : //gist.github.com/Blackjacx/2198d86442ec9b9b05c0801f4e392047
替换后,您只需获取textField.text
即可检索组合文本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.