2016-10-25 2 views
1

Ich habe TextField erstellt und möchte Text darin wie 43/35 formatieren. Nummer/Nummer - für Kreditkarten-Monat und Jahr.Schnell. Format Eingabe in TextFeld

Kann ich Number Fomat verwenden oder wie kann ich das einfacher machen? Das Problem hier, dass ich das 3. Zeichen ersetzen muss, wenn ich neues Zeichen hinzufüge und es entferne, wenn ich 2. entferne.

Ich will keine 3rd-Party-Bibliothek verwenden, muss ich native Implementierung

+1

Es ist keine Zahl, so Zahlenformatierung nicht funktionieren. Möchten Sie die Formatierung vornehmen, wie der Benutzer schreibt oder nachdem er den Text eingegeben hat? – rmaddy

+0

Nun, ich möchte es als Benutzer – user7065798

+0

wie kann ich es tun? – user7065798

Antwort

1

Dies ist meine aktuelle Lösung. Grundsätzlich müssen Sie:

1) Implementieren Sie die delegate Ihre textfield irgendwo (in meinem Code unten ich auf dem Viewcontroller implementiert)

2) Implementieren textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool.

die Maske anwenden zu können, habe ich einige Erweiterungen für Streich- und Charaktere, wie man am Ende des folgenden Codes sehen:

class ViewController: UIViewController { 
    @IBOutlet weak var textfield: UITextField! 

    let mask = "##/##" 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     textfield.delegate = self 
    } 
} 


extension ViewController: UITextFieldDelegate { 
    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
     guard let normalText = textField.text else { return false } 

     let beginning = textField.beginningOfDocument 
     // save cursor location 
     let cursorLocation = textField.positionFromPosition(beginning, offset: range.location + string.characters.count) 

     let newString = (normalText as NSString).stringByReplacingCharactersInRange(range, withString: string) 
     let newStringClean = newString.stringWithOnlyNumbers().withMask(mask) 

     guard newString != newStringClean else { return true } 

     textField.text = newStringClean 
     guard string != "" else { return false } 

     // fix cursor location after changing textfield.text 
     if let cL = cursorLocation { 
      let textRange = textField.textRangeFromPosition(cL, toPosition: cL) 
      textField.selectedTextRange = textRange 
     } 

     return false 
    } 
} 

extension String { 
    func stringWithOnlyNumbers() -> String { 
     return self.characters.reduce("") { (acc, c) -> String in 
      guard c.isDigit() else { return acc } 
      return "\(acc)\(c)" 
     } 
    } 

    func withMask(mask: String) -> String { 
     var resultString = String() 

     let chars = self.characters 
     let maskChars = mask.characters 

     var stringIndex = chars.startIndex 
     var maskIndex = mask.startIndex 

     while stringIndex < chars.endIndex && maskIndex < maskChars.endIndex { 
      if (maskChars[maskIndex] == "#") { 
       resultString.append(chars[stringIndex]) 
       stringIndex = stringIndex.successor() 
      } else { 
       resultString.append(maskChars[maskIndex]) 
      } 
      maskIndex = maskIndex.successor() 
     } 

     return resultString 
    } 

} 

extension Character { 
    func isDigit() -> Bool { 
     let s = String(self).unicodeScalars 
     let uni = s[s.startIndex] 

     let digits = NSCharacterSet.decimalDigitCharacterSet() 
     let isADigit = digits.longCharacterIsMember(uni.value) 

     return isADigit 
    } 
} 
+0

Wenn ich 3 Zeichen habe und auf Letzte löschen klicke, habe ich nur noch ein Zeichen in meinem Textfeld links – user7065798

+0

FIX: ERSETZEN WIEDERHERSTELLUNG WERT hueter string! = "" Else {return false} – user7065798

+0

tks @ user7065798! Ich habe es dort repariert – ghashi