• Feed
  • Explore
  • Ranking
/
/
    🎨 UIKit & SwiftUI

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

    iosSwift
    지
    지성
    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)
            }
        }






    - 컬렉션 아티클