tableView 에서 cell 이 재사용 되기 전에 불려서 준비시키는 함수이다. 꼭 써야하는 함수는 아님!

→ delegate 안에 있는 tableView(_:cellForRowAt:)에서 초기화를 해주는데 또 왜 prepareForReuse() 함수를 사용하는 이유는?

UITableViewCell 이 reuse identifier를 갖고 있으면, tableView는 prepareForReuse() 함수를 dequeReusableCell(withIdentifier:) 이 리턴되기 전에 부른다. 왜냐? 잠재적인 퍼포먼스 이슈를 피하기 위해! cell의 content와 관련 없는 것들만! 초기화해주는것이 좋다

cell의 content와 관련있는 것들은 tableView(_:cellForRowAt:) 에서 초기화

셀을 재사용하는 dequeReusableCellwithIdentifier 의 단점(중복으로 체크되는 점)을 개선하기 위해 사용되는 함수로 셀의 속성을 초기화 시켜준다.

테이블 보기는 셀 개체에 연결된 재사용 식별자가 없거나 를 사용 하여 기존 셀의 내용을 업데이트하는 경우 이 메서드를 호출하지 않습니다

테이블뷰의 dequeueReusableCell 때문이다. (collectionView도 마찬가지)

테이블뷰나 컬렉션뷰는 모두 셀을 “Reuse”, 재사용하는데 이런 셀의 재사용 구조가 큐로 되어있어서 “dequeue”라는 키워드도 등장하는 것이다. 아래 사진을 보면 이해가 더 쉽게 된다.

이렇게 dequeue, reuse 되는 과정이 흔히 사용했던 cellForRowAt delegate 메소드에서 dequeuReusableCellWithIdentifier함수를 통해 이루어진 것이다.

그래서 셀에 configure되는 데이터소스의 내용은 다르지만 셀 자체는 재사용되기 때문에 체크박스가 사라지지 않고 계속 보이는 상태로 있게된다.

Untitled

해결방법

결국 이 현상은 셀의 속성을 초기화시켜주지 않은 채 재사용하기 때문에 발생한다. 그래서 해결방법도 간단하다. 재사용되는 셀의 속성을 초기화시켜주면 된다.

// tableViewCell.swift
override func prepareForReuse() {
    super.prepareForReuse()

    self.accessoryType = .none
}

Untitled

이렇게 모든 재사용되는 셀에 대해 체크박스를 해제해주면 실제로 선택된 셀도 체크박스가 보이지 않게되므로, 데이터소스를 확인해서 선택된 셀은 체크박스를 다시 보이도록 설정해줘야한다.