我想在UITextField变空时执行某个操作(用户一个接一个地删除所有符号或使用clear选项)。
我考虑过使用两种方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
和
- (BOOL)textFieldShouldClear:(UITextField *)textField;
来自
UITextFieldDelegate
我不确定文本字段变空时如何检测情况? 我尝试过:
if ([textField.text length] == 0)
但它不起作用,因为在从文本字段中删除符号之前调用上述方法的fisrt。
有什么想法吗?
答案 0 :(得分:37)
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSRange textFieldRange = NSMakeRange(0, [textField.text length]);
if (NSEqualRanges(range, textFieldRange) && [string length] == 0) {
// Game on: when you return YES from this, your field will be empty
}
return YES;
}
请注意,在此方法返回之前该字段不会为空,因此您可能希望在此处设置一些中间状态,然后使用textFieldDidEndEditing:
知道用户已完成清空该字段
答案 1 :(得分:0)
以下代码也适用。
-(void)textfieldDidChange:(UITextField *)textField
{
if (textField == first)
{
[second becomeFirstResponder];
}
else if(textField == second)
{
if (textField.text.length == 0)
{
[first becomeFirstResponder];
}
else
{
[third becomeFirstResponder];
}
}
else if(textField == third)
{
if (textField.text.length == 0)
{
[second becomeFirstResponder];
}
else
{
[four becomeFirstResponder];
}
}
else if(textField == four)
{
if (textField.text.length == 0)
{
[third becomeFirstResponder];
}
else
{
[four becomeFirstResponder];
}
}
}
为每个文本字段添加了目标。对我来说,当文本为空当前文本字段时,我必须将光标放在前一个字段中。如果您需要任何清晰度,请告诉我。
答案 2 :(得分:0)
以下是正在搜索此代码的Swift 4.2版本的任何人。
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let textFieldRange = NSRange(location: 0, length: textField.text?.count ?? 0)
if NSEqualRanges(range, textFieldRange) && string.count == 0 {
// Do whatever you want when text field is empty.
}
return true
}
答案 3 :(得分:0)
这是一个不使用 NSRange 的解决方案
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
if(textField.text.length==1 && string.length==0){
//textfield is empty
}else{
//textfield is not empty
}
return true;
}