Как добавить разделитель после каждых 2 символов при изменении текста в текстовом поле в Swift 4 - PullRequest
0 голосов
/ 24 сентября 2018

В моем проекте необходимо добавить проверку MAC-адреса устройства при добавлении текста в текстовое поле.Формат моего MAC-адреса устройства: «AB: 5E: CF: 45: S5: 6D».Поэтому, когда бы я ни добавил какой-либо символ, его следует заменить, добавив двоеточие после 2 символов в текстовое поле.

Пример: «45DF5R6» = «45: DF: 5R: 6» «SD45ER65DF6G» = «SD: 45: ER: 65: DF: 6G ”

Благодарим вас за помощь.

Заранее спасибо.

Ответы [ 5 ]

0 голосов
/ 24 сентября 2018

Вы должны создать подкласс UITextField и добавить цель для редактирования измененного управляющего события, затем вам просто нужно удалить недопустимые шестнадцатеричные символы и снова отформатировать очищенную строку, используя метод для вставки символа каждые два символа в строку, как я написал вэто ответ :

class MacAddressField: UITextField {
    override func didMoveToSuperview() {
        keyboardType = .default
        textAlignment = .left
        autocorrectionType = .no
        autocapitalizationType = .none
        addTarget(self, action: #selector(editingChanged), for: .editingChanged)
    }
    @objc func editingChanged(_ textField: UITextField) {
        text!.removeAll { !(("A"..."F") ~= $0) &&
                          !(("a"..."f") ~= $0) &&
                          !(("0"..."9") ~= $0) }  // remove non hexa string characters
        text! = String(text!.lowercased().prefix(12))  // get the up to 12 characters lowercased
                .pairs.joined(separator: ":")  // and format it again
    }
}

extension String {
    var pairs: [String] {
        var result: [String] = []
        let characters = Array(self)
        stride(from: 0, to: count, by: 2).forEach {
            result.append(String(characters[$0..<min($0+2, count)]))
        }
        return result
    }
}
0 голосов
/ 24 сентября 2018

попробуйте

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let text = (textField.text! as NSString).replacingCharacters(in: range, with: string)
    let count = text.count
    if string != "" {
    if count > 17
    {
        return false
    }
    if count % 3 == 0{
        txtField.text?.insert(":", at: String.Index.init(encodedOffset: count - 1))
    }
    return true
  }
  return true
}
0 голосов
/ 24 сентября 2018

В delegate метод UITextField

func textField(_ textField: UITextField,  
               shouldChangeCharactersIn range: NSRange,
               replacementString string: String) -> Bool  

Добавьте логику, которая будет проверять длину MOD 2 строки, исключая character, который вы хотите вставить.Если вы получите remainder, равное 0, добавьте желаемый character в строку.

0 голосов
/ 24 сентября 2018

Вот еще один ответ для вас.Вы должны реализовать UITextFieldDelegate и установить делегат textField как self.Затем реализуйте приведенный ниже метод делегата.

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard let text = textField.text, let textRange = Range(range, in: text) else {
        return false
    }
    var updatedText = text.replacingCharacters(in: textRange, with: string)
    updatedText.removeAll(where: {$0 == ":"})
    let finalLength = updatedText.count + updatedText.count/2 - 1
    if finalLength > 17 {
        return false
    }
    for i in stride(from: 2, to: finalLength, by: 3) {
        let index = updatedText.index(updatedText.startIndex, offsetBy: i)
        updatedText.insert(":", at: index)
    }
    textField.text = updatedText
    return false
}

Логика здесь действительно проста для понимания:

  • Снимите строку со всех «:», которые вы, возможно, вставили в прошлый раз.
  • Вставьте «:» в каждую 3-ю позицию в строке и установите строку вручную в shouldChangeCharacters

Вы должны включить другую логику, такую ​​как ограничение символов, ограничения символов, копирование-паста обрабатывает себя.Ответ сфокусирован только на логике, связанной с добавлением и удалением «:»


Вам не нужно удалять «:», который вставляется при удалении символов .Например: если у вас есть «45: D» и вы нажимаете удалить один раз, у вас останется «45», а не «45:».

0 голосов
/ 24 сентября 2018

Вы ищете функцию делегата UITextField:

func textField(_ textField: UITextField,  
               shouldChangeCharactersIn range: NSRange,
               replacementString string: String) -> Bool  

Вы можете написать специфическую логику ввода в этой функции.Он часто используется для маскировки телефонных номеров или, скажем, ограничения количества символов, добавляемых в текстовое поле.Ваша проблема с форматированием также отлично подходит.

...