2009-08-23 122 views
5

我想创建PIN码对话框,就像您可以在iPhone上打开的对话框一样。创建PIN码对话框

对于那些没有看到它的人来说,它由四个盒子和一个数字键盘组成。输入数字时,第一个框中会出现一个圆点。等等。当你点击删除按钮时,最后一个点被删除。

我有这个设置四个UITextFields在我委托我听:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    [self performSelector:@selector(pickNext:) withObject:textField afterDelay:0.0]; 
    return YES; 
} 

的pickNext:方法将切换到下一个的UITextField,就像这样:

- (void)pickNext:(UITextField*)textField 
{ 
    switch ([textField tag]) { 
    case 1: 
     [pin2 becomeFirstResponder]; 
     break; 
    case 2: 
     [pin3 becomeFirstResponder]; 
     break; 
    case 3: 
     [pin4 becomeFirstResponder]; 
     break; 
    case 4: 
     [textField resignFirstResponder]; 
     break; 
    default: 
     break; 
    } 
} 

这其实工作,但我的问题是,当UITextField已经为空时,删除键不会产生任何通知。所以我无法移动到以前的UITextField。

那么有没有人有更好的消化如何解决这个问题。我在想隐藏的文本字段......?

回答

7

好的,所以我自己解决了。隐藏的文本域是要走的路。即使它是隐藏的,您仍然可以使其成为第一响应者,并且键盘将弹出。

所以总结:

在viewDidLoad中:

[hidden becomeFirstResponder]; 

然后我听的“编辑而改变”事件,并更新每个字符,四个可见的UITextField。就像这样:

- (IBAction)textChanged:(UITextField*)hiddenField 
{ 
    NSString *hiddenText = hiddenField.text; 

    [self setOneTextField:pin1 toString:hiddenText atIndex:0]; 
    [self setOneTextField:pin2 toString:hiddenText atIndex:1]; 
    [self setOneTextField:pin3 toString:hiddenText atIndex:2]; 
    [self setOneTextField:pin4 toString:hiddenText atIndex:3]; 
} 

- (void)setOneTextField:(UITextField*)textField toString:(NSString*)string atIndex:(NSInteger)index 
{ 
    if ([string length] > index) 
    textField.text = [string substringWithRange:NSMakeRange(index, 1)]; 
    else 
    textField.text = @""; 
} 

要限制的字符数在隐藏的UITextField四个字符我实现委托方法“shouldChangeCharactersInRange”:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    bool okToEdit = YES; 

    if (range.location > 3) 
    { 
    okToEdit = NO; 
    } else if (range.location == 3) { 
    [self performSelector:@selector(sendPinCodeNotification) withObject:nil afterDelay:0.0]; 
    } 
    return okToEdit; 
} 

- (void)sendPinCodeNotification 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:PINCODE_NOTIFICATION object:[NSString stringWithFormat:@"%@%@%@%@", pin1.text, pin2.text, pin3.text, pin4.text]]; 
} 

正如你可以看到我发送通知时第四位数字已输入。

1

你需要做的是钩每个在方法检查四个的UITextField的“的ValueChanged”事件和方法最多见,如果发件人的文本长度为0

您可以挂钩ValueChanged事件的四个UITextfields达到相同的方法,并打开标签,如上所述。下面的代码将做到这一点。

-(IBAction) pinChanged: (id)sender { 

    UITextField *currentField = (UITextField*) sender; 

    // if the field thqt has just been changed is blank 
    if ([currentField.text length] == 0) { 

     // switch on the fields tag, and go to the previous field 
     switch (currentField.tag) { 
      case 1: 
       // in first field already, stay here! 
       break; 
      case 2: 
       // go back to previous field 
       [pin1 becomeFirstResponder]; 
       break; 
      case 3: 
       // go back to previous field 
       [pin2 becomeFirstResponder]; 
       break; 
      case 4: 
       // go back to previous field 
       [pin3 becomeFirstResponder]; 
       break; 
      default: 
       break; 
     } 
    } 
} 
+0

好吧,ValueChanged显然没有为UITextField做任何事情,至少我没有得到任何事件。但“编辑已更改”不会发送事件,但同样,不是当该字段为空时,我点击了删除键。 – Kobski 2009-08-24 13:02:42