Как обнаружить отклоненный TextView в TableView? - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть tableView с динамическими ячейками с несколькими TextViews. Я закрываю клавиатуру с кнопкой «Отмена» и пытаюсь определить, какой TextView закрывается, чтобы «отменить» изменения, сделанные пользователем.

На основе этого похожего вопроса: Как определить, какое текстовое поле активно swift Я адаптировал один из ответов для следующего расширения:

extension UIView {
var textViewsInView: [UITextView] {
    return subviews
        .filter ({ !($0 is UITextView) })
        .reduce (( subviews.compactMap { $0 as? UITextView }), { summ, current in
            return summ + current.textViewsInView
        })
}
var selectedTextView: UITextView? {
    return textViewsInView.filter { $0.isFirstResponder }.first
}
}

Это работает, и сейчас я тестирую следующий код:

   @objc func cancelButtonAction() {
    if let test =  tableView.selectedTextView {
        print("View Found")
    }
    tableView.beginUpdates()
    tableView.endUpdates()
}

Делая перерыв при печати («Просмотр найден»), я могу проверить «тест». Ниже приводится результат.

enter image description here

Это, по-видимому, идентифицирует только тест просмотра по адресу памяти. У меня вопрос: как мне это интерпретировать, чтобы определить редактируемое представление?

Обновление: похоже, есть некоторая проблема в понимании. Предположим, у меня есть таблица с двумя ячейками и в каждой ячейке два textViews (динамические ячейки). Предположим, что таблица загружается, говоря в 4 textViews. «Привет, Джон», «Привет, Сэм», «Пока, Джон», «Пока, Сэм». Предположим, что пользователь начинает редактировать ячейку и меняет одну ячейку на «Начос». Затем пользователь решает отменить. Я хочу затем заменить на значение, которое было там раньше (из моей модели). Я могу найти textView, но теперь он читает "Nachos". Поэтому я не знаю, какой textView перезагрузить с соответствующим Привет и пока.

Ответы [ 2 ]

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

Я решил эту проблему, добавив свойство .tag к объектам textView. Я также отбросил подход расширения и использовал делегат textView. Решение потребовало, чтобы я сначала назначил тег и делегировать = self для каждого textView в tableView: cellForRowAt. Ниже показан один TextView из многих. Обратите внимание, что тег настроен, поэтому я могу определить раздел и строку, из которой он получен, а также конкретный элемент.

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
...
  cell.directionsTextView.delegate = self
  cell.directionsTextView.tag = indexPath.section*1000 + indexPath.row+1
  return cell 
 }

В моем классе tableView определены две глобальные переменные:

   var activeTextView = UITextView()
   var activeTextViewPresentText = String()

textViewDidBeginEditing фиксирует исходное состояние текста textView до того, как пользователь начинает редактирование.

      // Assign the newly active textview to store original value and original text
func textViewDidBeginEditing(_ textView: UITextView) {
    print("textView.tag: \(textView.tag)")
    self.activeTextView = textView
    self.activeTextViewPresentText = textView.text
}

Наконец, если пользователь отменяет редактирование, исходный текст перезагружается.

  @objc func cancelButtonAction() {
    if  activeTextView.text != nil {
        activeTextView.text = activeTextViewPresentText
    }
    self.view.endEditing(true)
    tableUpdate()
}
0 голосов
/ 14 ноября 2018

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

...