我有6个文本域名为digit1,digit2..etc upto digit6作为子视图添加到视图上。一旦用户在digit1文本字段中输入数字,我希望digit2文本字段自动聚焦,类似于在digit2文本字段中输入数字时,digit3应自动聚焦。显示的是我试过的代码。
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if(textField.text.length>=1)
{
[textField resignFirstResponder];
UITextField *_textField=(UITextField*) [self.view viewWithTag:textField.tag+1];
[_textField becomeFirstResponder];
}
return TRUE;
}
这里发生的事情是当我输入digit1中的数字时,它会出现在数字1中,但它出现在digit2中,当我单击删除按钮时,控件将被转移到后续的文本字段而不是删除当前文本字段中的文本。请帮我解决这个问题。
答案 0 :(得分:0)
假设您有3个文本字段,其名称如t1,t2和t3
设置t1 = 1,t2 = 3和t3 = 3
的标签值为所有文本字段设置标记值并编写此代码
然后编写此代码
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
switch(textField.tag){
case 1:{
if(textField.text.length>=1)
{
[t1 resignFirstResponder];
[t2 becomeFirstResponder];
break;
}
}
case 2:{
if(textField.text.length>=1)
{
[t2 resignFirstResponder];
[t3 becomeFirstResponder];
break;
}
}
case 3:{
if(textField.text.length>=1)
{
[t3 resignFirstResponder];
break;
}
}
}
}
return TRUE;
}
答案 1 :(得分:0)
我认为问题是在编辑实际发生之前调用了shouldChangeCharactersInRange。由于您正在更改第一响应者,因此编辑将在新的第一响应者中生效,而不是在旧的第一响应者中生效。
您可以尝试将if块中的代码移动到另一个方法,并使用[self performselector:withObject:afterDelay]调用它,将延迟设置为一些小值。类似的东西:
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if(textField.text.length>=1)
{
[self performSelector:@selector(switchTextField) withObject:nil afterDelay:0.1];
}
return TRUE;
}
-(void)switchTextField
{
[textField resignFirstResponder];
UITextField *_textField=(UITextField*) [self.view viewWithTag:textField.tag+1];
[_textField becomeFirstResponder];
}
那样shouldChangeCharactersInRange立即返回true(应该如此),编辑将在当前选中的textField中进行,然后你的switchTextField方法将很快被调用。这不是最干净的解决方案,但它是我能想到的最快的解决方案。
答案 2 :(得分:0)
我找到了解决方案
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString *str = [textField.text stringByReplacingCharactersInRange:range withString:string];
if( [str length] > 0 ){
textField.text = string;
UIResponder* nextResponder = [textField.superview viewWithTag:(textField.tag + 1)];
if (nextResponder) {
[nextResponder becomeFirstResponder];
}
return NO;
}
return YES;
}