2016-10-25 3 views
1

Я создал textField и хочу форматировать текст в нем, как 43/35. Номер/номер - для месяца и года кредитной карты.Swift. Формат ввода в textField

Могу ли я использовать цифру fomatter для этого или как я могу сделать это легче? Проблема здесь, что мне нужно заменить 3-го символа, если я добавлю новый символ и удалю его, если я удалю второй.

Я не хочу использовать любой 3-й библиотеки партии, мне нужно родной реализации

+1

Это не число, так число форматирование не будет работать. Вы хотите сделать форматирование по типу пользователя или после ввода текста? – rmaddy

+0

ну, я хочу, чтобы пользователь как – user7065798

+0

как я могу это сделать? – user7065798

ответ

1

Это мое текущее решение. В основном вам нужно:

1) Реализовать delegate вашего textfield где-то (в моем коде ниже я реализовывал на ViewController)

2) Реализовать textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool.

Чтобы применить маску, я создал несколько расширений для струнных и символов, как вы можете увидеть в конце следующего кода:

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

если у меня есть 3 символа и нажмите «Удалить последний», у меня останется только один символ в моем текстовом поле – user7065798

+0

ИСПРАВЛЕНИЕ: ЗАМЕНИТЬ ЦЕНУ RETuRN ЗДЕСЬ, чтобы сохранить строку! = "" Else {return false} – user7065798

+0

tks @ user7065798! Я исправил его там – ghashi

Смежные вопросы