2016-07-29 22 views
3

私は一連のtextfieldsを一列に持っています。各textfieldは2文字に制限されています。Swift UITextField deleteBackward Issue

私の問題は、最初のtextfieldになるまで、すべての文字を削除して、すべてtextfieldsに戻したいということです。

私はテキストフィールドをサブクラス化し、deleteBackwardメソッドをオーバーライドして、テキストフィールドのテキストが空であるかどうかを判断しました。そうであれば、レスポンダを前のテキストフィールドに変更します。

これはすべて問題ありませんが、テキストフィールドに1文字があり、バックスペースを押すとその文字は削除され、応答者は前のテキストフィールドに変更されます。

これは、文字が削除されたテキストフィールドにフォーカスを置いておき、削除キーを再度押すとレスポンダは前のテキストフィールドに変更する必要があるため、正しく動作しません。

私はこのテキストフィールドのshouldChangeCharactersデリゲートメソッドのフラグを修正しました。フラグが...場合はtrueに設定されている

if (newLength == 0 && currentLength == 0) || currentLength == 0 { 
    textFieldEmpty = true 
} else { 
    textFieldEmpty = false 
} 

これはうまく動作しますが、テキストフィールドが空で、バックスペースが押されたときに、このデリゲートメソッドが呼び出されていませんか?

誰もが同様の問題を解決し、どのようなアプローチをとっているのであれば、放浪しているだけですか?

おかげ

答えて

0

は、私は同様のシナリオを持っているが、すべてのテキストフィールド内の単一の文字と。私はまた、これを達成するためにカスタムtextFieldでdeleteBackwardを使用しました。

このコードを試してみてください。

import UIKit 
protocol CustomTextFieldDelegate{ 
func textFieldDidDelete() 
} 
class CustomTextField: UITextField { 
    var myCustomTextFieldDelegate : CustomTextFieldDelegate! 
    override func deleteBackward() { 
    super.deleteBackward() 
    myCustomTextFieldDelegate.textFieldDidDelete() 
} 
} 

そして、これはあなたがdeleteBackwardメソッドを実装する方法である:範囲メソッドでshouldChangeCharactersでも

func textFieldDidDelete() { 
    print("Entered Delete"); 
    print("Tag!!\(currentActiveTextField.tag)") 
    var previousTag = 0 
    if currentActiveTextField.text == ""{ 
     previousTag = currentActiveTextField.tag - 1 
    }else{ 
    previousTag = currentActiveTextField.tag 
    } 
    let previousResponder = currentActiveTextField.superview?.viewWithTag(previousTag) 
    if(previousTag > 0){ 
     let previousTextField = previousResponder as! CustomTextField 
     previousTextField.text = "" 
     currentActiveTextField = previousTextField 
     previousResponder?.becomeFirstResponder() 
    } 
} 

、テキストフィールドとしてごcurrentlyActiveTextFieldを設定することを忘れてはいけませんあなたは編集したい。次のコードを確認してください。私のテキストフィールドはタグ1,2,3,4を持っています。

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
    currentActiveTextField = textField as! CustomTextField 
    let nextTag = textField.tag + 1; 
    // get next responder 
    var nextResponder = textField.superview?.viewWithTag(nextTag); 


    // On inputing value to textfield 
    if (textField.text?.characters.count < 1 && string.characters.count > 0){ 

     if (nextResponder == nil){ 
      nextResponder = textField.superview?.viewWithTag(1); 
     } 
     textField.text = string; 

     if nextTag == 5 { 
      self.digitFourTextField.resignFirstResponder() 
      return true; 
     } 

     nextResponder?.becomeFirstResponder(); 
     return false; 
    } 
    if (textField.text?.characters.count >= 1 && string.characters.count == 0){ 
     // on deleteing value from Textfield 
     let presentTag = textField.tag; 
     // get next responder 
     var presentResponder = textField.superview?.viewWithTag(presentTag); 

     if (presentResponder == nil){ 
      presentResponder = textField.superview?.viewWithTag(1); 
     } 
     textField.text = ""; 
     presentResponder?.becomeFirstResponder(); 
     return false; 
    } 

    let currentCharacterCount = textField.text?.characters.count ?? 0 
    let newLength = currentCharacterCount + string.characters.count - range.length 
    if newLength > 1 { 
     textField.text = string 
     if (nextResponder != nil){ 
      nextResponder?.becomeFirstResponder(); 
     } 

    } 
    let returnVal = newLength <= 1 
    return returnVal; 
} 
関連する問題