2016-06-22 9 views
1

UITextFieldという形式の別のポストのコードを米国で使用していますが、ユーザーがテキストを消去する代わりに入力を開始したときにプレースホルダを残しておきます。たとえば。 +1(XXX)XXX-XXXXの後に入力すると、+1(23X)XXX-XXXXのようになります。 プレースホルダを完全に消去するのではなく、ユーザーにガイドとして残したいと思っています。私は現在使用していますプレースホルダー付きの電話番号のUITextField

コード:

func textFieldDidBeginEditing(textField: UITextField) { 
    if (textField == self.mobileNumberTextField) { 
     textField.text = "+" 
    } 
} 

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
    if (textField == self.mobileNumberTextField) { 
     let newString = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string) 

     if (newString.characters.count < textField.text?.characters.count && newString.characters.count >= 1) { 
      return true               // return true for backspace to work 
     } else if (newString.characters.count < 1) { 
      return false;      // deleting "+" makes no sence 
     } 
     if (newString.characters.count > 17) { 
      return false; 
     } 

     let components = newString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet) 

     let decimalString = components.joinWithSeparator("") as NSString 
     let length = decimalString.length 

     var index = 0 
     let formattedString = NSMutableString() 
     formattedString.appendString("+") 

     if (length >= 1) { 
      let countryCode = decimalString.substringWithRange(NSMakeRange(0, 1)) 
      formattedString.appendString(countryCode) 
      index += 1 
     } 

     if (length > 1) { 
      var rangeLength = 3 
      if (length < 4) { 
       rangeLength = length - 1 
      } 
      let operatorCode = decimalString.substringWithRange(NSMakeRange(1, rangeLength)) 
      formattedString.appendFormat(" (%@) ", operatorCode) 
      index += operatorCode.characters.count 
     } 

     if (length > 4) { 
      var rangeLength = 3 
      if (length < 7) { 
       rangeLength = length - 4 
      } 
      let prefix = decimalString.substringWithRange(NSMakeRange(4, rangeLength)) 
      formattedString.appendFormat("%@-", prefix) 
      index += prefix.characters.count 
     } 

     if (index < length) { 
      let remainder = decimalString.substringFromIndex(index) 
      formattedString.appendString(remainder) 
     } 

     textField.text = formattedString as String 

     if (newString.characters.count == 17) { 
      textField.resignFirstResponder() 
     } 

     return false 
    } 

    return true 
} 

答えて

1

私はあなたがテキストフィールドにデフォルトのテキストを使用することをお勧めします。あなたはプレースホルダと同じことをすることができると私は思う。

このデフォルトの文字列を文字の配列と考える。あなたは押された各キーを追跡し、デフォルトの文字列のインデックスの文字を、その文字列のデフォルトの文字列のインデックスに置き換えてください。

するTry何かのように:「 終了の場合、許可され よりもユーザーが複数の文字のみ交換:

var defaultstring = "+1 (XXX) XXX-XXXX" 
var yourtextField = UITextField() 

override func viewDidLoad() { 
    yourtextField.text = defaultstring 
} 

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
    if string != "" { 
     var range = self.defaultstring.rangeOfString("X") 

     self.defaultstring.replaceRange(range!, with: string) 
     self.yourtextField.text = self.defaultstring 
// I tested, this is working. 
    } 

    else if substring == "" { 
     // THis case if when user presses backspace.. 
     let idx = self.defaultstring.characters.indexOf("X")?.advancedBy(-1) 
     let range = self.defaultstring.rangeOfComposedCharacterSequenceAtIndex(idx!) 
     self.defaultstring.replaceRange(range, with: "X") 

    } 

} 

このコードは動作しますが、あなたのような気がする必要がある場合、いくつかのものがありますX "の文字が入力された場合 ユーザーがbackSpaceを使用しても動作しますが、範囲が-1で進み、次のcharが" - "の場合は、それをチェックして1回進みます-1より多く、置換する文字は確実です。X

詳細について質問してください。

+0

はい、これは機能しました。ありがとう:) –

+0

@AnkitKhanna喜んでそれが働いた –