지난 글에서 UITableView에서 셀을 드래그해서 data source를 수정하는 방법에 대해서 알아봤었어요.
하지만.. 이상한 버그가 일어나서 버그 해결을 하고 가도록 하겠습니다.
보시는 것 처럼 시간차이를 두고 update가 되죠..? ㅠㅠ
문제 상황을 자세히 보면 드래그 되는 친구 말고는 바로 바뀌는걸 볼 수 있는데, 드래그가 되는 친구는 시간이 지나고 업데이트 되는 것을 알 수 있어요.
하지만 얘는 무슨 도박도 아니고 됐다가 안됐다가...🤪
snapshot을 apply하는 곳이랑 dataSource 메소드에 각각 프린트문을 찍어봤을 때 실제로 결과가 dataSource 메소드가 실행될 때도 있고, 그렇지 않을 때도 있어요.. 왜이러는걸까요?
override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
guard let fromItem = itemIdentifier(for: sourceIndexPath),
let toItem = itemIdentifier(for: destinationIndexPath),
sourceIndexPath != destinationIndexPath else { return }
var snap = snapshot()
snap.deleteItems([fromItem])
if destinationIndexPath.row > sourceIndexPath.row {
snap.insertItems([fromItem], afterItem: toItem)
} else {
snap.insertItems([fromItem], beforeItem: toItem)
}
apply(snap, animatingDifferences: true)
print("✨✨✨✨✨apply")
}
private func setPlaceListTableDataSource() {
self.dataSource = PlaceListTableDataSource(tableView: self.placeListView.mapPlaceTableView) { tableView, indexPath, place -> UITableViewCell? in
guard let cell = tableView.dequeueReusableCell(withIdentifier: MapPlaceTableViewCell.identifier, for: indexPath) as? MapPlaceTableViewCell else { return nil }
print("🔥🔥🔥🔥🔥cell configure")
cell.configure(number: indexPath.row + 1, place: place)
cell.deleteButton.tag = indexPath.row
cell.deleteButton.addTarget(self, action: #selector(self.didTapDeleteButton(_:)), for: .touchUpInside)
return cell
}
}
// 실행 결과
✨✨✨✨✨apply // 1번째 -> 안됨..
✨✨✨✨✨apply // 2번째 -> 안됨..
✨✨✨✨✨apply // 3번째 -> 얘는 됨..
🔥🔥🔥🔥🔥cell configure
🔥🔥🔥🔥🔥cell configure
🔥🔥🔥🔥🔥cell configure