UITextField для номера телефона с заполнителем

Я использую приведенный ниже код из другого сообщения для форматирования UITextField для номера телефона в США, но когда пользователь начинает печатать вместо очистки текста, я хочу, чтобы заполнитель оставался. Например. +1 (XXX) XXX-XXXX после ввода должно выглядеть как +1 (23X) XXX-XXXX. Вместо того, чтобы полностью очищать заполнитель, я хочу, чтобы он оставался в качестве руководства для пользователя.

Код, который я сейчас использую:

    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
}

person Ankit Khanna    schedule 22.06.2016    source источник


Ответы (1)


Я бы посоветовал вам использовать текст по умолчанию в текстовом поле. Вы можете сделать то же самое с заполнителем, я думаю

Думайте об этой строке по умолчанию как о массиве символов. Вы должны отслеживать каждую нажатую клавишу и заменять символ по индексу в строке по умолчанию на введенную подстроку (по этому индексу в строке по умолчанию). И когда символ удаляется, вы должны заменить обратно этот символ (X).

Попробуйте что-то вроде:

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, а следующий символ, который вы должны заменить, - "-", тогда вы должны проверить это и еще раз перейти на -1, чтобы заменяемый символ наверняка был X

Задавайте вопросы по любым деталям.

person Akshansh Thakur    schedule 22.06.2016