我正在使用以下代码尝试让textField2
的文字内容在用户输入textField1
时更新为与textField1
匹配。
- (BOOL) textField: (UITextField *)theTextField shouldChangeCharactersInRange: (NSRange)range replacementString: (NSString *)string {
if (theTextField == textField1){
[textField2 setText:[textField1 text]];
}
}
然而,我观察到的输出是......
当textField1为“123”时,textField2为“12” 当textField1为“1234”
时,textField2为“123”
......当我想要的是:
当textField1为“123”时,textField2为“123” 当textField1为“1234”
时,textField2为“1234”
我做错了什么?
答案 0 :(得分:267)
-shouldChangeCharactersInRange
被称为,这就是您获取旧文本值的原因。要在更新后使用文本:
[textField2 setText:[textField1.text stringByReplacingCharactersInRange:range withString:string]];
答案 1 :(得分:51)
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString * searchStr = [textField.text stringByReplacingCharactersInRange:range withString:string];
NSLog(@"%@",searchStr);
return YES;
}
答案 2 :(得分:34)
根据接受的答案,以下内容适用于 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
。
答案 3 :(得分:23)
不要使用UITextFieldDelegate,而是尝试使用UITextField的"Editing Changed"事件。
答案 4 :(得分:10)
在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
}
答案 5 :(得分:7)
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
}
答案 6 :(得分:5)
这是您需要的代码,
if ([textField isEqual:self.textField1])
textField2.text = [textField1.text stringByReplacingCharactersInRange:range withString:string];
答案 7 :(得分:1)
使用警卫
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
}
答案 8 :(得分:0)
我的解决方案是使用UITextFieldTextDidChangeNotification
。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(copyText:) name:UITextFieldTextDidChangeNotification object:nil];
不要忘记在[[NSNotificationCenter defaultCenter] removeObserver:self];
方法中致电dealloc
。
答案 9 :(得分:0)
如果您需要用此替换文本字段文本,您可以使用我的解决方案(Swift 3):https://gist.github.com/Blackjacx/2198d86442ec9b9b05c0801f4e392047
替换后,您只需textField.text
即可检索撰写文本。