[英]Using `textField:shouldChangeCharactersInRange:`, how do I get the text including the current typed character?
I'm using the code below to try and have textField2
's text content get updated to match textField1
's whenever the user types in textField1
.我正在使用下面的代码尝试更新textField2
的文本内容以匹配textField1
每当用户输入textField1
。
- (BOOL) textField: (UITextField *)theTextField shouldChangeCharactersInRange: (NSRange)range replacementString: (NSString *)string {
if (theTextField == textField1){
[textField2 setText:[textField1 text]];
}
}
However, the output I observe is that...但是,我观察到的输出是......
textField2 is "12", when textField1 is "123" textField2 为“12”,当 textField1 为“123”时
textField2 is "123", when textField1 is "1234" textField2 为“123”,当 textField1 为“1234”时
... when what I want is: ...当我想要的是:
textField2 is "123", when textField1 is "123" textField2 为“123”,当 textField1 为“123”时
textField2 is "1234", when textField1 is "1234"当 textField1 为“1234”时,textField2 为“1234”
What am I doing wrong?我究竟做错了什么?
-shouldChangeCharactersInRange
gets called before text field actually changes its text, that's why you're getting old text value. -shouldChangeCharactersInRange
在文本字段实际更改其文本之前被调用,这就是您获得旧文本值的原因。 To get the text after update use:要在更新后获取文本,请使用:
[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;
}
Based on the accepted answer, the following should work in Swift 3 :根据接受的答案,以下内容应该适用于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
}
Both String
and NSString
have methods called replacingCharacters:inRange:withString
. String
和NSString
都有称为replacingCharacters:inRange:withString
。 However, as expected, the former expects an instance of Range
, while the latter expects an instance of NSRange
.然而,正如预期的那样,前者需要一个Range
实例,而后者需要一个NSRange
实例。 The textField
delegate method uses an NSRange
instance, thus the use of NSString
in this case. textField
委托方法使用NSRange
实例,因此在这种情况下使用NSString
。
不要使用 UITextFieldDelegate,而是尝试使用 UITextField 的“Editing Changed”事件。
In Swift(4), without NSString
(pure Swift):在 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
}
As an extension:作为扩展:
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 version for it : 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
}
This is the code you need,这是你需要的代码
if ([textField isEqual:self.textField1])
textField2.text = [textField1.text stringByReplacingCharactersInRange:range withString:string];
use guard使用警卫
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
}
My solution is to use UITextFieldTextDidChangeNotification
.我的解决方案是使用UITextFieldTextDidChangeNotification
。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(copyText:) name:UITextFieldTextDidChangeNotification object:nil];
Don't forget to call [[NSNotificationCenter defaultCenter] removeObserver:self];
不要忘记调用[[NSNotificationCenter defaultCenter] removeObserver:self];
in dealloc
method.在dealloc
方法中。
If you need to replace the textfield text with this you can use my solution (Swift 3): https://gist.github.com/Blackjacx/2198d86442ec9b9b05c0801f4e392047如果您需要用这个替换文本字段文本,您可以使用我的解决方案(Swift 3): https : //gist.github.com/Blackjacx/2198d86442ec9b9b05c0801f4e392047
After the replacement you can just get textField.text
to retrieve the composed text.替换后,您只需获取textField.text
即可检索组合文本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.