2012-09-14 54 views
1

我爲我的應用程序註冊了一個頁面。系統會提示用戶輸入一個手機號碼和一個四位數的PIN碼,以便在應用程序中使用。有三個單元格字段可幫助標準化單元格格式 - 第一個字段是三位數字幷包含區號,第二個字段也是三位數字,最後一個字段是四個。接下來是PIN字段。當用戶在給定的框中輸入正確的數字位數時,我希望下一個字段變爲活動狀態。例如,當某人輸入區號的三位數字時,光標應前進到下一個框。如何在用戶輸入一定數量的字符時自動將光標移動到下一個字段

我已經得到它的工作,以便如果繼續鍵入光標將移動。但是,只有在輸入後纔會移動(例如,鍵入區號的三位數字,然後鍵入另一位數字,並且該數字將與光標一起出現在下一個框中;光標不移動只輸入三位數字後)。此外,我使用的方法似乎有一個小故障,如果它們已經有了所需數量的字符,就不可能編輯這些字段。

這是我目前使用的代碼:我很欣賞

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string]; 
    NSUInteger newLength = newString.length; 

    if (textField.tag == 3) { 
     if (newLength == 4) { 
      [cellField2 becomeFirstResponder]; 
     } 
    } 
     if (textField.tag == 4) { 
      if (newLength == 4) { 
       [cellField3 becomeFirstResponder]; 
      } 
     } 
      if (textField.tag == 5) { 
       if (newLength == 5) { 
        [pinField becomeFirstResponder]; 
       } 
     } 
    if (textField.tag == 6) { 
     if (newLength == 5) { 
      [pinField resignFirstResponder]; 
     } 
    } 

    return YES; 
} 

任何幫助,謝謝。

ETA:編輯包含danh的代碼,我知道它比我正在做的更正確。但是,我的光標問題仍然存在。

+0

如果你希望它第三個字符後移動,你需要使用if(newLength == 3),而不是4 – lnafziger

+0

如果我做第三個字符放入下一個文本字段。 – Dante

+0

有趣。我想這是因爲你告訴新的textField成爲第一個響應者,並且它在這個函數返回之前執行它。然後我會發佈一個不同的方式。 – lnafziger

回答

2

請注意,您不需要使用標籤,因爲您已將它們全部放在網點中,因此您可以使用:if (textField == cellField1) {,或者甚至更好:if (textField == self.cellField1) {。這也使得您可以更輕鬆地遵循您的代碼並識別您正在操作的文本字段。

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string]; 
    NSUInteger newLength = newString.length; 

    if (textField == self.cellField1) { 
     if (newLength == 3) { 
      [cellField1 setText:newString]; 
      [cellField2 becomeFirstResponder]; 
      return NO; // NO because we already updated the text. 
     } 
    } 

    if (textField == self.cellField2) { 
     if (newLength == 3) { 
      [cellField2 setText:newString]; 
      [cellField3 becomeFirstResponder]; 
      return NO; 
     } 
    } 

    if (textField == self.cellField3) { 
     if (newLength == 4) { 
      [cellField3 setText:newString]; 
      [pinField becomeFirstResponder]; 
      return NO; 
     } 
    } 

    if (textField == pinField) { 
     if (newLength == 5) { 
      [pinField resignFirstResponder]; 
      return YES; 
     } 
    } 

    return YES; 
} 
1

有幾件事情:

newLength首先需要有新的字符串,這應該解決計數的問題:

NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string]; 
NSUInteger newLength = newString.length; 

接下來,你可以只發送becomeFirstResponder。因爲它隱含在成爲中,所以不需要發出辭呈。

此方法最後應回答YES

+0

感謝您的回答。這並沒有成功地推進遊標,但是(從功能上看,它似乎是一樣的)。我的問題是我想要推進光標,所以對用戶來說很明顯下一個字段已成爲第一響應者。使用這種方法時,只有當第一個字符出現在該框中時,光標纔會出現在新的文本框中。 – Dante

+0

也許我正在犯一些簡單的錯誤,需要關注它,但我相信我已經完全實現了@ danh的建議(請參閱上面的代碼,我現在正在使用該代碼)並且它不能解決我的問題。 – Dante

0

lnafziger的答案很好!那些正在尋找快速解決方案的人,這裏是我的快速2.2代碼。

func textField(textField: UITextField, shouldChangeCharactersInRangerange: NSRange, replacementString string: String)-> Bool 
{ 

    let newString = ((textField.text)! as NSString).stringByReplacingCharactersInRange(range, withString: string)// Convert text into NSString in order to use 'stringByReplacingCharactersInRange' function 

    let newLength = newString.characters.count // Count the length of 'String' type variable 

    if (textField == cellField1) { 

     if (newLength == 3) { 

      cellField1.text = newString 
      cellField2.becomeFirstResponder() 
      return false 
     } 
    } 

    if (textField == cellField2) { 

     if (newLength == 3) { 

      cellField2.text = newString 
      cellField3.becomeFirstResponder() 
      return false 
     } 
    } 

    if (textField == cellField3) { 

     if (newLength == 4) { 

      cellField3.text = newString 
      pinField.becomeFirstResponder() 
      return false 
     } 
    } 

    if (textField == pinField) { 

     if (newLength == 5) { 

      pinField.resignFirstResponder() 
      return true 
     } 
    } 

    return true 

} 
相關問題