contentOffsetForScrollingToRowAtIndexPath: atScrollPosition: usingPresentationValues - PullRequest
0 голосов
/ 30 октября 2018

Мне удалось использовать один массив в качестве источника данных для создания сообщений в firebasechat. Я могу отправлять сообщения в данный момент. Однако я хотел бы показать сообщения в моем tableview сверху. Когда я попробовал scrollToRow, это не сработало. Если я уберу его, сообщения могут быть отправлены, но не обновляются в tableview. Вот мой вывод.

Завершение работы приложения из-за неперехваченного исключения 'NSRangeException', причина: '- [UITableView _contentOffsetForScrollingToRowAtIndexPath: atScrollPosition: usingPresentationValues:]: row (9) за пределами (9) для раздела (0).'

var tableObjects: [String] = []

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

private func generateMessages() {
                let userReference = userReference(userID: AppDelegate.shared.user!.userID, fullName: AppDelegate.shared.user!.fullName, status: .buddy)
                guard let stringText = textField.text else { return }
                let message = AppDelegate.shared.userMessages[stringText]
                let addMessage = "\(AppDelegate.shared.addMessage(stringText, to: self.conversation!, sender: userReference, type: .text, date: message?.date))"
                self.tableObjects.append(addMessage)
                self.tableView.beginUpdates()
                let indexPath = IndexPath(row: self.tableObjects.count - 1, section: 0)
                self.tableView.insertRows(at: [indexPath], with: .top)
                self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
                self.tableView.endUpdates()
                textField.text = nil
            }

func numberOfSections(in pTableView: UITableView) -> Int {
            return 1
        }

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

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

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

1 Ответ

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

это просто, вы пытаетесь прокрутить до конца таблицы endUpdates, вы должны поместить

self.tableView.endUpdates()

до

self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)

ваш код должен выглядеть как

private func generateMessages() {
    let userReference = userReference(userID: AppDelegate.shared.user!.userID, fullName: AppDelegate.shared.user!.fullName, status: .buddy)
    guard let stringText = textField.text else { return }
    let message = AppDelegate.shared.userMessages[stringText]
    let addMessage = "\(AppDelegate.shared.addMessage(stringText, to: self.conversation!, sender: userReference, type: .text, date: message?.date))"
    self.tableObjects.append(addMessage)
    self.tableView.beginUpdates()
    let indexPath = IndexPath(row: self.tableObjects.count - 1, section: 0)
    self.tableView.insertRows(at: [indexPath], with: .top)
    self.tableView.endUpdates()
    self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
    textField.text = nil
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...