2013-08-29 27 views
1

下一個代碼僅在用戶輸入第三個字符時才起作用。我希望焦點在用戶輸入第二個字符時移動TextField,但仍然保留第一個TextField中的前兩個字符。如果我嘗試類似newString.length < 2的東西,則在連續輸入2個字符時,我將獲得第一個字符UITextField和第二個字符UITextField輸入2個字符後從UITextfield移動焦點

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string]; 

    if (newString.length <= 2) 
    { 

     return YES; 
    } 
    else 
    { 
     NSInteger nextTag; 
     nextTag = textField.tag + 1; 

     UIResponder* nextResponder = [textField.superview viewWithTag:nextTag]; 
     if (nextResponder) { 
      [nextResponder becomeFirstResponder]; 
     } 
     else { 
      [textField resignFirstResponder];    
     } 
    } 
    return YES; 
} 
+0

你用'newString.length <= 1'試圖改變編輯? – zbMax

+0

你在'else'中錯過了一個return語句。嘗試在那裏添加'return YES'。 –

+0

^Typo。同樣的結果。 – Segev

回答

1

我相信這應該工作:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string]; 

    if(newString.length == 2) 
    { 
     UIResponder* nextResponder = [textField.superview viewWithTag:textField.tag + 1]; 

     if (nextResponder) { 
      [nextResponder performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.1]; 
     } 
     else { 
      [textField resignFirstResponder]; 
     } 
    } 

    return newString.length <= 2; 
} 

請您嘗試一下,並告訴我,如果它的工作原理。如果沒有,請告訴我更多關於你的設置,我將嘗試設置一個像你的視圖,我會嘗試解決方案更容易。

好吧,編輯以上作品。這不是很漂亮,但它做的工作。令人傷心的是,蘋果不會爲didChangeCharactersInRange添加一個更合適的方法。

EDIT根據沙的發現0.1而不是0的定時器間隔

EDIT根據麥克的建議

+0

這將無法正常工作。輸入23將會產生:第一個textfield = 2,第二個textfield = 3。你可以創建一個簡單的視圖,帶有3個帶標籤的UITextFields 1 2 3 4. – Segev

+0

不是編輯前的代碼,而是'newString.length == 3'? – zbMax

+0

我已經在上面添加了一個工作解決方案 –

相關問題