2017-02-04 5 views
-1

電話番号に入力する3つのテキストフィールドがあります。私は各文字フィールドの文字制限を3文字に設定しようとしています。これが達成されると、新しいテキストフィールドに切り替わります。新しいテキストフィールドに入力に切り替えること文字制限に達したときに次のUITextFieldに切り替える

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 

    let currentCharacterCount = textField.text?.characters.count ?? 0 
    if (range.length + range.location > currentCharacterCount){ 
     return false 
    } 
    let newLength = currentCharacterCount + string.characters.count - range.length 
    return newLength <= 25 
} 

及びこれを使用する:

私は文字を制限するために、このコードを使用するためにオンライン見

.didbecomefirstresponder() 

が、私はどのように確認していませんテキストフィールドを3文字に制限し、次のフィールドに切り替えます。

答えて

1

UITextFieldshouldChangeCharactersInRangeの代理人メソッドを使用できます。あなたは少しセットアップ作業を行う必要があるでしょう。ここでは、3つのtextFieldを作成し、UITextFieldDelegateに準拠し、あなたが記述しているのと似たようなことをする例を示します。

class ViewController: UIViewController, UITextFieldDelegate { 


var max = 3 
var fields:[UITextField] = [] 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 


    // This is just an example to layout 3 text fields. 
    for i in 0 ..< 3 { 
     let field = UITextField() 
     view.addSubview(field) 
     field.delegate = self 
     field.borderStyle = .roundedRect 
     field.font = UIFont(name: "AvenirNext-Regular", size: 15.0) 
     field.textColor = UIColor.black 
     field.frame = CGRect(x: view.bounds.width/2 - 100, y: 100 + (150*CGFloat(i)), width: 200, height: 50) 
     fields.append(field) 
    } 


} 

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
    // Make sure the field has non-nil text 
    if let text = textField.text { 
     // Check if the text length has reached max limit 
     if text.characters.count > (max-1) { 
      // Get index of field from fields array 
      if let index = fields.index(of: textField) { 
       // Make sure it's not the last field in the array else return false 
       if index < fields.count-1 { 
        // Make the next field in the array become first responder if it's text is non-nil and it's text's character count is less than desired max 
        if fields[index+1].text != nil && fields[index+1].text!.characters.count < (max-1) { 
         fields[index+1].becomeFirstResponder() 
        } else { 
         return false 
        } 
       } else { 
        return false 
       } 
      } 
     } 
    } 
    return true 
} 

} 
2

これは私がこれを解決する方法を、私のコードです:

3つのテキストフィールドがあります:あなたのクラスにで

@IBOutlet var txtField1: UITextField! 
@IBOutlet var txtField2: UITextField! 
@IBOutlet var txtField3: UITextField! 

輸入UITextFieldDelegateと、すべてのテキストフィールドのために自己にデリゲートを設定します。

このメソッドを使用してフォーカスを変更します。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 

    let currentCharacterCount = ((textField.text?.characters.count)! + string.characters.count) - 1 

    switch (textField, currentCharacterCount) { 
    case (self.txtField1, 3): 
     self.txtField2.becomeFirstResponder() 
    case (self.txtField2, 7): 
     self.txtField3.becomeFirstResponder() 
    default: 
     break 
    } 

    return true 
} 

ここでは、最初のテキストフィールドに3、2番目のテキストフィールドに7を設定します。

関連する問題