개인 프로젝트를 진행하던 도중 문제가 발생했습니다.
한참을 원인을 찾다가 발견한 사실은 예전에도 겪은 문제였다는 거였습니다.
문제의 원인은 TableView Cell의 재사용이었습니다.
예전에 +와 -버튼으로 테이블 뷰의 셀의 개수를 조절하려 했는데
+버튼으로 셀의 갯수를 늘리니 이전에 담은 데이터가 다시 담겨 나오더라고요?
그때 아 내부적으로 cell이 재사용되는구나 싶었고
그러면 새로운 cell의 데이터를 초기화해줘야겠다 싶어서
+버튼을 누르면 동작하는 함수에 생성한 cell에 접근해서 데이터를 다시 초기화하는 코드를 작성했었습니다.
(Table.row)접근했습니다.
오늘도 원하지 않던 모습으로 cell 표시되는 문제를 발견했는데
처음에는 재사용 문제인 줄 모르고 한참을 코드를 보다가
+와 -버튼을 번갈아가며 누르니 cell이 잘 나올 때도 있고 잘 안 나올 때가 있는 걸 보고
아 이거 이번에 추가한 코드가 재사용될 때 초기화되지 않았구나 깨달았습니다.
그러다 다른 해결방법은 없을까 찾아보니 바로 방법이 나왔습니다.
prepareForReuse() 함수를 쓰는 것입니다!!
내용을 대충 해석하자면 셀을 재사용하기위해 호출하기 전에 이 메서드를 먼저 호출한다고 합니다.
그래서 이 메서드에서 셀의 속성을 초기화하면 된다는 내용이네요.
주의할점은 이 메서드를 새로운 데이터를 할당하는데 쓰지말라고 합니다.
이게 무슨 소린가 싶어 조금 더 찾아보니
이 함수의 용도 자체가 cell을 초기화하는 것이라서
이미지나 텍스트 같은 것을 초기화하는 것을 목적으로 사용한다고 하네요.
사용 예시를 보시죠.
override func prepareForReuse() {
super.prepareForReuse()
// 셀이 재사용될 때 호출되는 메서드
titleLabel.text = nil
subtitleLabel.text = nil
// 다른 속성들을 초기화
}
tableViewCell 클래스 내부에 이렇게 코드를 작성하시면
나중에 titleLabel의 text를 수정한 상태로 cell이 재사용 되어도
처음의 nil값인 상태로 cell이 나타납니다.
저처럼 Cell을 생성하고나서 초기화하셔도 작동은 하겠지만
이전의 데이터가 잠깐 보인다던지 하는 문제가 있을 수 있으니
이 방법을 더 추천합니다.
참고한 글
https://velog.io/@dlwns33/Swift-셀의-재사용-문제-해결하기prepareForReuse