如何获取UITextField的textDidChange方法?每次对文本字段进行更改时,我都需要调用方法。这可能吗? 谢谢!
答案 0 :(得分:47)
只要文本字段发生变化,您就可以使用UITextFieldTextDidChangeNotification
来调用方法。将其添加到您的init
:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange:) name:UITextFieldTextDidChangeNotification object:nil];
答案 1 :(得分:20)
您可以设置代理并使用
- (BOOL) textField: (UITextField *) textField shouldChangeCharactersInRange: (NSRange) range replacementString: (NSString *) string;
答案 2 :(得分:3)
你也可以成为目标& UIControlEventEditingChanged
事件的选择器。例如:
[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]
请注意,这只会在用户启动的文本字段更改时调用,并且在以编程方式设置文本时不会自动调用。
答案 3 :(得分:1)
进一步阐述Ben Gottlieb的答案,使用textField shouldChangeCharactersInRange很棒,但缺点是有些事情会发生一个字符延迟。
例如,一旦你输入了一个角色并且它不再是空的,那么在没有文字的情况下调用下面的内容就会被称为后面的角色。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if (!textField.text.length) {
// Do something with empty textfield
}
return YES;
}
以下方法可让您在textField中进行基本更改。尽管不像NSNotification那样直接,它仍允许您使用不同textFields的类似方法,因此在尝试在文本字段中进行特定字符更改时使用它是非常有用的。
以下代码修复了字符延迟
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
// This means it updates the name immediately
NSString * newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
textField.placeholder = newString.length ? @"" : @"Name";
return YES;
}
此代码用于在textField中没有文本时将占位符添加到UITextField
答案 4 :(得分:1)
我在委托shouldChangeCharactersInRange中使用replaceCharactersInRange
时发现了一些问题。
例如:越南语键盘字符串aa
- > â
,因此,如果您使用方法replaceCharactersInRange
,则结果不正确。
您可以在这种情况下通过事件UIControlEventEditingChanged
尝试:
[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]
答案 5 :(得分:0)
快速解决方案
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let newString = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string)
return true
}
答案 6 :(得分:0)
以下是我使用的Swift 4
public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let fieldText = textField.text else {
return false
}
// Append the existing textfield text with the new character
var text = fieldText + string
// If it is the very first character, textfield text will be empty so take the 'string' and on delete also textfield text get deleted with a delay
if range.location == 0{
text = string
}
return true
}