[UIKit] UITableView에서 데이터 삭제 후 ‘Index out of range’ 오류 해결 방법

iosSwift
avatar
2025.02.19
·
3 min read

UITableView에서 데이터를 삭제할 때 Index out of range 오류가 발생하는 경우가 있다.

다들 알다시피 이 오류는 Index가 설정된 범위를 넘어버릴 경우 발생되는 에러이다.

나의 경우엔 배열의 요소가 제거된 상태에서 접근을 시도하여 발생했다.

이 글에서는 이 오류의 원인과 해결 방법을 정리한다.


문제 상황

테이븗에서 deleteRows(at:with:)를 호출할 때 다음과 같은 오류가 발생했다.

Fatal error: Index out of range

이 오류는 보통 아래 두 가지 원인으로 발생한다.

  1. 데이터 배열을 먼저 업데이트 하지 않음

  2. 삭제 후 테이블뷰의 데이터소스를 업데이트하지 않음

해결 방안

  1. 데이터 배열을 먼저 업데이트 하지 않은 경우

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
            tableView.deleteRows(at: [indexPath], with: .automatic) // ❌ 먼저 삭제
            dataArray.remove(at: indexPath.row) // ❌ 나중에 배열 업데이트 → Index out of range 오류 발생
        }
    }
    • deleteRows(at:)를 먼저 실행하면, UITableView는 데이터가 여전히 존재한다고 가정함

    • 그 후 dataArray.remove(at:)를 실행하면 배열의 크기가 줄어들어 Index 오류 발생

    • 먼저 데이터 배열을 업데이트한 후 deleteRows(at:)를 호출

      if editingStyle == .delete {
          dataArray.remove(at: indexPath.row) // ✅ 먼저 배열에서 삭제
          tableView.deleteRows(at: [indexPath], with: .automatic) // ✅ 이후에 UI 업데이트
      }
  2. 삭제 후 테이블뷰의 데이터소스를 업데이트하지 않은 경우

    • 테이블뷰가 numberOfRowsInSection을 호출할 때, 데이터 배열의 크기와 일치하지 않으면 Index out of range 오류 발생

    • 삭제 후 테이블뷰를 안전하게 리로드

      if editingStyle == .delete {
          dataArray.remove(at: indexPath.row)
          
          if dataArray.isEmpty {
              tableView.reloadData() // ✅ 데이터가 없으면 전체 리로드
          } else {
              tableView.deleteRows(at: [indexPath], with: .automatic)
          }
      }






- 컬렉션 아티클