2014-07-02 35 views
0

我有5个UITextFields彼此相邻。每个人都应该捕获一个针号的数字。这是我如何将输入限制为1个字符并将光标移动到下一个文本字段。如何在UITextField上触发方法

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
    { 
     if (self.pin1.text.length == 1 && range.length == 0) [self.pin2 becomeFirstResponder]; 
     if (self.pin2.text.length == 1 && range.length == 0) [self.pin3 becomeFirstResponder]; 
     if (self.pin3.text.length == 1 && range.length == 0) [self.pin4 becomeFirstResponder]; 
     if (self.pin4.text.length == 1 && range.length == 0) [self.pin5 becomeFirstResponder]; 
     return YES; 
    } 

一旦用户在最后一个文本字段(pin5)中输入最后一位数字,我想添加一些功能来检查引脚。现在NSLog会做。我该怎么做呢?

如果我将这行代码添加到shouldChangeCharactersInRange的末尾。您必须点击一个数字两次以获取第5位数字。

if (self.pin5.text.length == 1 && range.length == 0) NSLog(@"Pin %@, %@, %@, %@, %@", self.pin1.text, self.pin2.text, self.pin3.text, self.pin4.text, self.pin5.text); 
+0

根据你的模式,你会不会只是增加一个if语句来检查,如果文本已经被添加到5脚? – CrimsonChris

+0

有5个文本字段似乎非常有用... – trojanfoe

+0

@CrimsonChris - 好的想法,请参阅上面的编辑。 – user3626407

回答

0
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    if (string.length > 0 && textField.text.length < 1) { 
     textField.text = string; 
     if (textField == self.pin1) [self.pin2 becomeFirstResponder]; 
     else if (textField == self.pin2) [self.pin3 becomeFirstResponder]; 
     else if (textField == self.pin3) [self.pin4 becomeFirstResponder]; 
     else if (textField == self.pin4) [self.pin5 becomeFirstResponder]; 
     else if (textField == self.pin5) NSLog(@"Pin %@, %@, %@, %@, %@", self.pin1.text, self.pin2.text, self.pin3.text, self.pin4.text, self.pin5.text); 
    } 
    return (textField.text.length + string.length) <= 1; 
} 
+0

这是行不通的,第5次点击它显示引脚。由于某种原因,它开始于pin2并最终将2个字符放入pin5中? – user3626407

+0

@ user3626407更新了它。 – CrimsonChris

+0

非常感谢,现在当点击数字键盘时,现在会填充pin1和pin2。 pin5仍然接受2个字符。我们快到了 – user3626407

0

如何添加最后的声明?

if (self.pin5.text.length == 1 && range.length == 0) { 
    NSLog(@"Hey there!"); 
} 

您可能还想在开始时禁用所有的字段(第一个除外),以便您可以逐个启用它们。

+0

我试过这个,并且出于一些奇怪的原因,您必须单击第5个数字两次才能调用此代码。 – user3626407

0

只是return语句之前添加此行:

if (self.pin5 == textField) { 
    self.pin5.text = string; 
    [self.pin5 resignFirstResponder]; // You can hide the keyboard if you like 
    NSLog(@"Last text field"); 
} 
+0

我试过这个,出于一些奇怪的原因,你必须点击第5个数字两次来调用这段代码。 – user3626407

+0

@ user3626407请参阅编辑答案。 – Greg

+0

同样,必须再次点击数字键盘上的第5位数字。 – user3626407

0

你可以试试这个。像这样设置你的文本框。

[self.pin1 addTarget:self 
       action:@selector(textFieldDidChange:) 
    forControlEvents:UIControlEventEditingChanged]; 
... 
[self.pin5 addTarget:self 
       action:@selector(textFieldDidChange:) 
    forControlEvents:UIControlEventEditingChanged]; 

然后在另一个方法做到以下几点:

-(void)textFieldDidChange:(id)sender { 
    if (sender == self.pin1) [self.pin2 becomeFirstResponder]; 
     else if (sender == self.pin2) [self.pin3 becomeFirstResponder]; 
     else if (sender == self.pin3) [self.pin4 becomeFirstResponder]; 
     else if (sender == self.pin4) [self.pin5 becomeFirstResponder]; 
     else if (sender== self.pin5) { 

      [self.pin5 resignFirstResponder]; 
      NSString *pinString = [NSString stringWithFormat:@"%@ %@ %@ %@ %@", self.pin1.text, self.pin2.text, self.pin3.text, self.pin4.text, self.pin5.text]; 
      NSLog(@"%@", pinString); 
     } 
} 
+0

我希望Apple会将这个动作添加到UITextFieldDelegate。 – CrimsonChris

+0

这个完美的作品!谢谢。 – user3626407

+0

@CrimsonChris是的,它是奇怪的,他们会有*应该*改变字符,但不是*做*改变字符。 – Milo

相关问题