Как встроить UITextView в UITableViewCell с пользовательской ячейкой, которая является делегатом? - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть UITableViewController с двумя пользовательскими ячейками - одна содержит UITextField (для ввода пользователем названия), а другая - UITextView (для ввода пользователем описания).Всякий раз, когда они меняются, я хочу обновить свой объект памяти (который представляет собой структуру с двумя переменными - memoryTitle и memoryDescription).

MemoryTitle кажется достаточно простым - на моем ViewController у меня есть следующее:

 @IBAction func memoryTitleChanged(_ sender: UITextField) {
        memory.memoryTitle = sender.text ?? ""
    }

Хотя UITextView меня немного смутил.У меня есть две проблемы - я не могу создать действие таким же образом, как я могу для UITextField, поэтому моей следующей мыслью было сделать ViewController делегатом и использовать textViewDidChange для обновления memory.memoryDescription, но это подводит меня к моемуВторая проблема.

Чтобы динамически изменить размер ячейки UITextView, я использовал следующий учебник, который отлично работает (https://medium.com/@georgetsifrikas/embedding-uitextview-inside-uitableviewcell-9a28794daf01), чтобы сделать мою собственную ячейку такой:

class DetailTextTableViewCell: UITableViewCell, UITextViewDelegate {

    //Found below method for resizing UITextView and cell - https://medium.com/@georgetsifrikas/embedding-uitextview-inside-uitableviewcell-9a28794daf01
    @IBOutlet weak var memoryDescriptionTextView: UITextView!
    var textChanged: ((String) -> Void)?

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        memoryDescriptionTextView.delegate = self
        memoryDescriptionTextView.backgroundColor = UIColor.red
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }

    //Found below method for resizing UITextView and cell - https://medium.com/@georgetsifrikas/embedding-uitextview-inside-uitableviewcell-9a28794daf01
    func textChanged(action: @escaping (String) -> Void) {
        self.textChanged = action
    }

    func textViewDidChange(_ textView: UITextView) {
        textChanged?(textView.text)
    }
}

Теперь я застрял с DetailTextTableViewCell, являющимся делегатом UITextView, поэтому я не уверен, как заставить его обновлять мой объект памяти в ViewController при изменении текста. Если у кого-то есть какие-либо идеи или рекомендации, это будет высоко ценится!

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

Ответы [ 4 ]

0 голосов
/ 21 февраля 2019

объявите этот протокол над вашей ячейкой DetailTextTableViewCell

protocol CellDelegate {
  func textViewChanged(textView : UITextView)
}

добавьте делегат var в DetailTextTableViewCell

var delegate : CellDelegate?

В ячейке для строки вашего tableView присвойте себе значениеделегировать свойство ячейки

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
...
cell.delegate = self

}

В вашем DetailTextTableViewCell добавить эту строку внутри textViewDidChange

 func textViewDidChange(_ textView: UITextView) {
    textChanged?(textView.text)
    delegate?.textViewChanged(textView)
}

Теперь реализовать функцию делегата в вашем контроллере представления

func textViewChanged(textView: UITextView) {

    }
0 голосов
/ 21 февраля 2019

Попробуйте включить свойство взаимодействия с пользователем текстового представления в методе cellForRowAt.

cell.memoryDescriptionTextView.delegate = self
cell.memoryDescriptionTextView.isUserInteractionEnabled = true
0 голосов
/ 21 февраля 2019

Во-первых, вам не нужен textChanged метод

func textChanged(action: @escaping (String) -> Void) {


Затем, что вам нужно,назначает вашу textChanged переменную закрытия (что, кстати, хорошо подходит) в контроллере cellForRowAt для каждой определенной ячейки.

Внутри закрытия объявляют, что когда текстовое представление изменилось, определенные элементы (из источника данных табличного представления)свойство array) будет присвоено String параметром закрытия и, если вам нужно, перезагрузить определенную ячейку для этого IndexPath

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    ...
    cell.textChanged = { text in
        self.dataSourceArray[indexPath.row].stringProperty = text
        // tableView.reloadRows(at: [indexPath], with: .none) 
            // if you want to reload row, move calling closure 
            // to `textViewDidEndEditing` instead
    }
    ...
}
0 голосов
/ 21 февраля 2019

Внутри cellForRowAt сделать

let cell = /// 
cell.memoryDescriptionTextView.tag = indexPath.row
cell.memoryDescriptionTextView.delegate = self

и реализовать методы делегата внутри vc

...