Неожиданное поведение text textFieldShouldBeginEditing / textFieldDidBeginEditing - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть UItextField с именем textField в tableView статической ячейки.В этом поле содержится сумма в валюте, например, «10 000,00 долларов США».

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

Я делаю это в textFieldShouldBeginEditing.

В первый раз, когда я делаю это, все работает.Содержимое textField переформатируется без разделителя валют и групп.

Вкл. textFieldDidEndEditing Я переформатирую значение в правильную строку валюты снова.Это также работает.

Проблема возникает, когда я повторно вхожу в поле во второй раз.Во время отладки я вижу, что textField.text превратился в строку без символа валюты и символа группировки, , но на дисплее не отображается, что .Хотя это сработало с первого раза!Во второй раз кажется, что существует несоответствие между тем, что на экране, и значением, которое видит отладчик.

Я пробовал что-то вроде:

  • tableView.beginUpdates ();tableView.endUpdates ()
  • textView.setNeedsDisplay

... но это не работает.

Поэтому я скопировал код, который удаляет форматирование валюты в textFieldShouldBeginEditing для нового метода делегата textFieldDidBeginEditing.

Тогда все работало нормально.Я мог нажимать другие элементы управления и возвращаться к textField несколько раз, и каждый раз, когда элемент управления терял бы свое форматирование при вводе, и после потери фокуса возвращался к форматированной строке валюты.

Поэтому я решил удалитьметод textFieldShouldBeginEditing.Но потом все снова сломалось!Похоже, я должен реализовать как textFieldShouldBeginEditing, так и textFieldDidBeginEditing, чтобы иметь возможность подготовить содержимое textField для редактирования пользователем?

Это ошибка?

extension Double {
    public func doubleToString(numberStyle: NumberFormatter.Style, decimals: Int, withThousandSeparator: Bool) -> String {
        let numberFormatter = NumberFormatter()
        numberFormatter.numberStyle = numberStyle
        numberFormatter.maximumFractionDigits = decimals
        if !withThousandSeparator {
            numberFormatter.groupingSeparator = ""
        }
        return numberFormatter.string(from: NSNumber(value: self)) ?? ""
    }
}

func textFieldDidBeginEditing(_ textField: UITextField) {
    if textField === self.textField {
        textField.text = amount.doubleToString(numberStyle: .decimal, decimals: 2, withThousandSeparator: false)
    }
}

1 Ответ

0 голосов
/ 16 ноября 2018

Вам следует попробовать изменить текст textField, добавив следующий код:

Добавить цель в textField для измененного текста:

self.textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)

Функция для textField'sизменение текста:

func textFieldDidChange(_ textField: UITextField)
{
    if textField === self.textField
    {
         //try formatting here
    }
}
...