본문 바로가기

개발/Swift

[Swift] TableView 특정 Cell 만 Reload/업데이트 하기

셀을 삭제, 모달 뷰 띄우기 후 dismiss 등 인터렉션 시

테이블 뷰가 삭제, 호출 전 상태를 그대로 띄우고 있는 경우가 있습니다.

스와이프된 상태로 유지 되어있다던지.. (아래 gif이미지 참고)

 

취소했지만 돌아오지 않는 셀..

 


이럴 때 두가지 방법이 있습니다.

첫번째, tableView 데이터 전체를 리로드 tableView.reloadData()

두번째, 사용자가 인터렉션한 Cell만 리로드 하는 것

 

어느정도 차이가 있을지 모르지만 데이터 양에 따라서

UX나, 자원관리 측면으로는 사용자가 인터렉션한 셀만 리로드하는 것이 좋을 것입니다.

특히, 서버에서 데이터를 가져온다면 request 수를 줄여 자원을 효율적으로 관리할 수 있는 이점이 있습니다.

 

 

예시와 같이 tableView delegate 메소드인 commit editingStyle 메소드에 구현하였습니다.

(실제로는 오픈소스인 SwipeCellKit을 사용하긴 했지만 방법은 동일합니다)

 

tableView.reloadRows(at: [indexPath], with: .none)

 

 

위 메소드의 with 파라미터를 통해 Cell을 업데이트할 때 애니메이션을 선택할 수도 있습니다.

저는 .none로 애니메이션을 따로 지정하지 않았습니다.

// TableViewController.swift

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {

    // 이 부분을 추가해줍니다.
    self.tableView.reloadRows(at: [indexPath], with: .none) 

	// 아래는 삭제 눌렀을 시와 기타 동작 
    switch editingStyle {
    case .delete :
        print("삭제동작")
    default :
        print("기본동작")
    }

}

 

 

자 확인해보면 사용자가 인터렉션한 셀이 사용자 인터렉션 후 바로 리로드 되는 것을 확인 할 수 있습니다.

 

 

 

반응형