Как получить номер строки ячейки, в которой редактировался UITextView? - PullRequest
0 голосов
/ 27 декабря 2018
  • У меня есть UITextView внутри каждой ячейки UITableView
  • Я использую Базовые данные для сохранения данных, которыенабрал в UITextView
  • Я хотел бы сохранить текст, набранный в UITextView, как только пользователь закончит его редактирование
  • Я добавил UITextViewDelegate в мою TableViewCell class
  • Я использую Уведомления , чтобы опубликовать новый текст на TableViewController

Я могу получитьновый текст для TableViewController , но я не знаю, как получить номер строки ячейки, содержащей текстовое представление, в котором был набран текст.Мне нужно знать номер строки (или объект в этой строке), чтобы обновить правильный NSManagedObject.

Что я пробовал:

  • Я думал об использовании тегов, но так как мне нужно постоянно добавлять и удалять строки, это не лучший подход

  • Я пытался использовать DidSelectedRowAtIndexPath , но он не срабатывает, когда пользователь касается UITextView (UITextView покрывает до 80% одной ячейки)

В классе TableViewCell у меня есть:

    func textViewDidEndEditing(_ textView: UITextView) {

    // Post notification

    let userInfo = [ "text" : textView.text]

    NotificationCenter.default.post(
    name: UITextView.textDidEndEditingNotification, 
    object: nil, 
    userInfo: userInfo as [AnyHashable : Any])
}

В TableViewController у меня есть:

    //Subscribe
    NotificationCenter.default.addObserver(self, 
    selector: #selector(textEditingEnded(notification:)),
    name: UITextView.textDidEndEditingNotification, 
    object: nil)


    @objc func textEditingEnded(notification:Notification) {

        guard let text = notification.userInfo?["text"] as? String else {return}
        print ("text: \(text)")   
    }

Не стесняйтесь спрашиватьбольше деталей.Я буду признателен за любую помощь, которую я могу получить!

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Я надеюсь, что вы можете иметь переменную внутри вашего UITableViewCell подкласса для определенного элемента

var item: Item?

, затем в cellForRowAt установите определенное значение item для определенной ячейки

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = ...
    ...
    cell.item = array[indexPath.row]
    ...
}

сейчасвы можете реализовать UITextViewDelegate для своего подкласса ячеек, и вы можете использовать метод textViewDidEndEditing для обработки, когда пользователь завершит ввод

class YourCell: UITableViewCell {
    ...
    var item: Item?
    ...
    override func awakeFromNib() {
        yourTextView.delegate = self
    }
}

extension YourCell: UITextViewDelegate {
    func textViewDidEndEditing(_ textView: UITextView) {
         ... // here save text and here you can use variable `item`
    }
}
0 голосов
/ 27 декабря 2018
  • Создайте свойство типа NSManagedObject в ячейке табличного представления.
  • В Интерфейсном Разработчике подключите delegate текстового представления к ячейке.
  • Вконтроллер передает соответствующий элемент источника данных в cellForRowAt в ячейку.
  • Удалите наблюдателя и вместо публикации уведомления измените атрибут в экземпляре NSManagedObject напрямую и сохраните контекст.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...