Заголовок раздела TableView перемещается при редактировании строки

#ios #swift #uitableview

#iOS #swift #uitableview

Вопрос:

Я создаю приложение iOS с помощью TableView, оно использует базу данных Realm для datamodel. Когда я пытаюсь удалить строку, перетаскивая ячейку влево, заголовок раздела следует за движением перетаскивания влево. При нажатии кнопки delete ячейка удаляется, а заголовок раздела перемещается обратно в нужное место.

Есть какие-либо подсказки, почему заголовок раздела перемещается вместе с ячейкой?

Ячейка заголовка определяется в раскадровке как ячейка динамического прототипа, а ячейки строк определяются в отдельном xib и регистрируются в tableview. В ячейке раздела параметр «Отступ при редактировании» не отмечен в раскадровке.

«Еженедельный отчет» находится в заголовке раздела.

До и после перетаскивания для редактирования

Вот код, который я реализовал для включения редактирования:

 func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    return true
}


func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == .delete {
        try! realm.write {
            let reportToDelete = reportList[indexPath.row]
            realm.delete(reportToDelete)
            tableView.deleteRows(at: [indexPath], with: .fade)
        }
    }
}
  

Я пробовал как на устройстве, так и на двух разных симуляторах, а также с очисткой папки сборки.

Редактировать

Заголовок загружается из раскадровки, где он имеет повторно используемый идентификатор: «WeeklyReportHeader», и пользовательский просмотр, возвращаемый делегатом TableView.

 func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    return tableView.dequeueReusableCell(withIdentifier: "WeeklyReportHeader")! as UIView 
}
  

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

1. Является ли ячейка заголовка и ячейки строки одного типа?

2. Я имею в виду тот же пользовательский класс

3. Нет .. Заголовок раздела не является подклассом, это просто UITableViewCell, а ячейка строки является определенным подклассом UITableViewCell.

4. Хорошо, я думаю, что у меня есть решение для вас, минутку.

5. На самом деле, прежде чем я все это напишу, не могли бы вы добавить код, который вы используете для создания заголовка, в свой вопрос? Это помогло бы мне узнать, на правильном ли я пути.

Ответ №1:

Я думаю, что это как-то связано с использованием ячейки в качестве заголовка, возможно, какая-то проблема связана с повторным использованием ячейки.

Чтобы исправить это, вместо того, чтобы использовать саму ячейку (и использовать ее как UIView для заголовка), используйте ее свойство contentView, которое в любом случае является UIView.

Например

 func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    return tableView.dequeueReusableCell(withIdentifier: "WeeklyReportHeader")!.contentView
}
  

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

1. Нет проблем 🙂 рад, что смог помочь!