2009-08-23 208 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