Не удалось передать значение текстового поля - PullRequest
0 голосов
/ 17 июня 2020

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

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

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if let _ = raDelegate {
        raDelegate?.durationChanged(hrs: string)
    }
    return true
}

И на первый взгляд, это то, что у меня есть ...

 func durationChanged(hrs: String) {

        myView.durationTextField.text = hrs
  }

Теперь проблема в том, что если я наберу "5" в текстовое поле в функции durationChanged, при применении точки останова, Я получаю значение в hrs как «5». Но когда я удаляю точку останова и запускаю, то, наконец, выводится myView.durationTextField.text - 55. Также, если я напечатаю «7» после этого, «55» будет заменено на «77». Хотя в идеале я должен был получить "57".

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Вы неправильно использовали shouldChangeCharactersIn. обновите свой код с помощью расширения вашего контроллера

extension YourController: UITextFieldDelegate {
        func textField(_ textField: UITextField,
                       shouldChangeCharactersIn range: NSRange,
                       replacementString string: String) -> Bool {
            if let text = textField.text,
               let textRange = Range(range, in: text) {
               let updatedText = text.replacingCharacters(in: textRange,
                                                           with: string)

                raDelegate?.durationChanged(hrs: updatedText)
            }
            return true
        }
    }

Или попробуйте этот обходной путь

extension YourController: UITextFieldDelegate {

            func textField(_ textField: UITextField,
                           shouldChangeCharactersIn range: NSRange,
                           replacementString string: String) -> Bool {
     let previousText:NSString = textField.text! as NSString
     let updatedText = previousText.replacingCharacters(in: range, with: string)
     raDelegate?.durationChanged(hrs: updatedText)

      return true
}
0 голосов
/ 17 июня 2020

вы неправильно его используете. строка в функции shouldChangeCharactersIn не является значением textField.

например: 1. textField.text = "" 2. ввод 5 -> диапазон равен (0,0), строка равна 5, textField.text = "" (TextField.text еще не изменен, это зависит от возвращаемого значения функции делегата, если true, он заменит textField.text на in range на строку) 3. input 7 -> range is ( 1,0), строка - 7, textField.text = "5" 4. backspace -> диапазон - (2, 1), строка - "", textField = "57"

После 4 ваш textField.text = "5"

, чтобы вы могли изменить свой код:

let stringAfterChanged = ((textField.text ?? "") as NSString).replacingCharacters(in: range, with: string)
raDelegate?.durationChanged(hrs: stringAfterChanged)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...