Вставьте данные в новые строки в UITableview, используя кнопку отправки - PullRequest
0 голосов
/ 30 октября 2018

Я создаю приложение для чата, используя firebasechat. Я использую кнопку и пытаюсь сгенерировать сообщения, используя textfield и button для отправки сообщений. Я могу это сделать. Однако я хотел бы напечатать и отправить сообщения, чтобы показать его в моем tableview в чате. В тот момент, когда пользователь печатает сообщение, оно генерируется и создается в firebase. Это отображается только в tableview после того, как я убил и снова запустил приложение, нажав кнопку отправить. Я даже обновил свой источник данных, так что я больше не получаю сбои, говоря numbers of rows isn't equal to items inserted. Когда я добавляю сообщение в userMessages, он падает, давая мне это.

'Неверное обновление: недопустимое количество строк в разделе 0. Количество строк, содержащихся в существующем разделе после обновления (2), должно быть равно количеству строк, содержащихся в этом разделе до обновления (0)

 var objects: [String] = []
 var userMessages = [Any]()
 var userChat:UserChat? = nil

 override func viewDidLoad() {
       super.viewDidLoad()
       self.objects = self.userChat!.iDs
 }

 @IBAction func sendButton(_ pSender: UIButton) {
        generateMessages()
    }

 private func generateMessages() {
        let userReference = UserReference(userID: AppDelegate.shared.user!.userID, fullName: AppDelegate.shared.user!.userName, status: .user)
        guard let stringText = textField.text else { return }
        let message = AppDelegate.shared.userMessages[stringText]
        self.conversationMessages.insert(AppDelegate.shared.addMessage(stringText, to: self.conversation!, sender:userReference, type: .text, date: message?.date), at: 0)
        let indexPath = IndexPath(row: 0, section: 0)
        self.tableView.insertRows(at: [indexPath], with: .top)
        self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
        self.tableView.reloadData()
    }

func tableView(_ pTableView: UITableView, numberOfRowsInSection pSection: Int) -> Int {
        return self.userMessages.count
    }

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let row = self.objectAtIndexPath(indexPath)
         let theCell = tableView.dequeueReusableCell(withIdentifier: reUseIdentifier, for: indexPath)
        return theCell
    }

 func objectAtIndexPath(_ indexPath: IndexPath) -> String {
        return self.objects[indexPath.row]
    }

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Вместо использования нескольких массивов используйте один массив, например self.userMessages в numberOfRowsInSection.

используйте этот метод для обновления self.userMessages

func textField (_ textField: UITextField, shouldChangeCharactersIn диапазон: NSRange, замена String string: String) -> Bool {

    let value = (textField.text as NSString?)?.replacingCharacters(in: range, with: string) ?? string

self.userMessages.append (значение)

вернуть истину

} Теперь перезагрузите представление таблицы в func textFieldShouldEndEditing (_ textField: UITextField) -> Bool { вернуть истину }

0 голосов
/ 30 октября 2018

Ваш код довольно запутанный. У вас есть три массива.

  • В numberOfRowsInSection возвращается число userMessages
  • In cellForRowAt objects используется.
  • Новое сообщение вставлено в conversationMessages

Это на самом деле причина ошибки. Используйте один массив в качестве источника данных

...