Как добавить ячейку в TableView без перезагрузки всех данных?

#ios #swift #uitableview

#iOS #swift #uitableview

Вопрос:

Как я могу добавить ячейку (пользовательскую) в TableView? Я попробовал следующее:

   @IBAction func AddCommentButton(_ sender: Any) {
        addComment() {
             //1)
            self.tableView.beginUpdates()
            tableView.reloadRows(at: [arrayOfComments.count].indices, with: .automatic)
            self.tableView.endUpdates()
               //2)
//            let cell = tableView.dequeueReusableCell(withIdentifier: "commentCell", for: tableView.numberOfRows(inSection: 0)) as! commentTableViewCell
//            addTemporaryComment(cell: cell)
        }
    }
  

1) дает:

Не удается преобразовать значение типа ‘Диапазон.Индекс>’ (он же ‘Диапазон’) к ожидаемому типу аргумента ‘[indexPath]’

2) Который использует этот метод, также вызывает много ошибок: все;

Использование неразрешенного идентификатора ‘indexPath’; вы имели в виду ‘indexPath’?

     func addTemporaryComment(cell: commentTableViewCell) {
    do {
        let url = URL(string: (arrayOfComments[indexPath.row].user.profileImageUrlString)!)
        let imageData = try Data(contentsOf: url!)
        let image = UIImage(data: imageData)

        cell.dateOfComment.text = arrayOfComments[indexPath.row].date
        cell.commentText.text = arrayOfComments[indexPath.row].commentText
        cell.profImage.image = image
        cell.username.text = arrayOfComments[indexPath.row].user.username
    } catch {
        print(error, ": Failed in do block converting image")
    }
}
  

}

Я даже не знаю, будет ли это работать.

Как я могу это исправить, если это правильный способ сделать это, а если нет, то как мне заставить это работать?

Комментарии:

1. В func addTemporaryComment(cell: commentTableViewCell) вы не передали indexPath вот почему он выдает сообщение об ошибке. Попробуйте добавить параметр indexPath func addTemporaryComment(cell: commentTableViewCell, indexPath: IndexPath)

Ответ №1:

Первым шагом должно быть добавление новых данных в массив, используемый table view для заполнения данных

 YourTablearray.append([labeltext])  
  

Затем обновите данные таблицы, чтобы вставить ячейку в конец таблицы

 tableName.beginUpdates()
tableName.insertRowsAtIndexPaths([
NSIndexPath(forRow: YourTablearray.count-1, inSection: 0)], withRowAnimation: .Automatic)
tableName.endUpdates()
  

Комментарии:

1. Однако как мне вставить ячейку?

2. Приведенный выше метод insertRowsAtIndexPath создает ячейку и вставляет ее в указанный путь индекса. Обязательным условием является обновление данных новой ячейки в массиве

3. Я получаю завершающее приложение из-за неперехваченного исключения ‘NSInternalInconsistencyException’, причина: ‘Недопустимое обновление: недопустимое количество строк в разделе 0. Количество строк, содержащихся в существующем разделе после обновления (12), должно быть равно количеству строк, содержащихся в этом разделе до обновления (12), плюс или минус количество строк, вставленных или удаленных из этого раздела (1 вставлено, 0 удалено), и плюс или минус число строк, вставленных или удаленных из этого раздела.строк, перемещенных в этот раздел или из него (0 перемещено, 0 перемещено). ‘

4. Вы обновили массив, используемый для заполнения tableview? вы также можете попробовать перезагрузить новую вставленную ячейку TableView.reloadRows(по адресу: [indexPath], с помощью: .automatic)

5. Нет необходимости в вызовах begin/endUpdates here . Вам это нужно только при нескольких вызовах insert/delete/reloadRowsAt , и вам нужно, чтобы пути к индексам оставались согласованными между этими вызовами.