테이블 뷰 셀에서 버튼을 누르면 DB 를 업데이트하고, reloadData 를 진행하던 도중 이상한 일들이 발생했다.
분명히 TagLabel 의 데이터가 없었던 셀인데 다른 셀의 TagLabel을 사용해서 보여지는 경우라거나,
셀의 마지막에 lineView 를 보이게끔 했는데 필터링으로 다른 셀이 보여지게끔 했을 때도 lineView 가 중간에 없어지는 현상등이 발생했다.
해결하기 위해 찾아보던 도중 prepareForReuse() 함수를 알게 되었고, 이를 통해 정상적으로 셀을 보이게 할 수 있었다.
1. prepareForReuse()란?
prepareForReuse() 메서드는 UITableViewCell과 UICollectionViewCell에서 호출되는 특별한 메서드
이 메서드는 셀이 재사용 큐에 들어가기 직전에 호출되며, 셀의 상태를 초기화하는 데 사용
2. 언제 prepareForReuse()를 사용해야 하는가?
셀의 상태가 재사용 과정에서 이전 상태에 영향을 받는지 여부에 따라 prepareForReuse()를 사용해야 하는지 결정할 수 있다.
예를 들어, 셀 안에 체크박스가 있고 체크 상태가 데이터에 따라 달라지는 경우, 체크 상태는 prepareForReuse()에서 초기화해야 한다.
그렇지 않으면, 체크된 셀이 재사용되면서 체크되지 않아야 하는 셀에 체크 표시가 나타날 수 있다.
3. 어떻게 prepareForReuse()를 사용하는가?
prepareForReuse() 메서드를 오버라이드하여 셀의 상태를 초기화하는 코드를 작성한다.
다만, 셀의 모든 상태를 초기화할 필요는 없다. 셀의 뷰와 관련된 상태만 초기화하면 된다.
데이터와 관련된 상태는 이후에 cellForRowAt나 cellForItemAt에서 셀에 데이터를 설정할 때 업데이트된다.
4. 결론
셀의 재사용은 테이블 뷰와 콜렉션 뷰의 효율성을 높이는 중요한 메커니즘이지만, 잘못 관리하면 예상치 못한 문제를 일으킬 수 있다..
prepareForReuse() 메서드를 활용하여 셀의 상태를 적절히 관리하면, 이러한 문제를 해결할 수 있다!
엄청 오랜 시간동안 데이터, 셀, indexPath, reloadData 등등.. 무엇이 문제인지 한참 찾았는데
다 정상이여서 도대체 뭐가 문제인지 모르겠어서 너무 힘들었다.
하지만 셀의 재사용에 관한 키워드로 문제를 찾아보니 prepareForReuse 라는 함수를 알게되었고,
드디어 해결할 수 있었다..
'iOS' 카테고리의 다른 글
복잡한 ViewController 에서의 VIewDidLoad or init 순서 (0) | 2024.05.01 |
---|---|
서버에서 주는 에러메세지도 디코딩으로 받아보기 (0) | 2024.04.24 |
Kingfisher - Error Handling (0) | 2024.04.15 |
Custom Modal · Alert (1) | 2024.03.26 |
Background Timer (0) | 2024.03.26 |