[Swift|TIL] 240414 - (AppStore) 코드로 셀 커스터마이징하기 / cell이 재사용되기 전, 초기에 1번 호출하자 - awakeFromNib()
💚 목표
스탠다드반 과제로 appstore 검색 뷰를 만드는 중이다.
아래 사진이 완성 뷰이다.
💚 진행 상황
⬇️ ViewController와 TableViewCell을 별도의 파일로 만들었고, 스토리보드에서 디자인했다.
⬇️ 한편, 스토리보드 인스펙터 영역에서 조작할 수 있는 기능이 한정적이라서
몇몇 객체의 디자인 및 제약조건은 코드로 구현했다.
⬇️ 뷰컨트롤러에서는 dataSource를 self로 설정, cell을 register했다.
DataSource 관련해서는 일단 행을 3개 불러오도록 했다.
💚 문제
현재 마주하고 있는 문제는
코드로 구현한 디자인/제약조건 함수를 어느 위치에서 호출해야 하는지이다.
💚 문제 해결
Try 1️⃣ - layoutSubviews() 👉 ❌
layoutSubviews() 에서 호출하면 첫 셀이 이상하게 보여진다.
그러나, 첫 셀에 setChartLableView()가 적용된 것으로 봐서,
코드는 정상적으로 실행되었으나, previewImage 부분에서 알 수 없는 문제가 발생한 것 같다.
한편, 테이블 뷰 바닥을 찍고 돌아오면 첫 셀이 정상적으로 바뀐다.
🥕 정리 ) layoutSubviews()는 불리는 타이밍이 여러번이고, 예측하기 어려운 함수이므로
셀을 커스터마이징하는 함수를 호출하기 적합하지 않다.
Try 2️⃣ - prepareForReuse() 👉 ❌
공식문서(링크)에 따르면
재사용가능한 셀을 테이블에 추가하는 dequeueReusableCell(withIdentifier:for:)메소드는
셀의 prepareForReuse() 메소드를 호출한다고 한다.
그래서 이번에는 prepareForReuse() 메소드에 디자인 코드를 호출시켜보았다.
결과는 더 이상하다.
셀 3개 모두 이상하다.
테이블 뷰 바닥을 찍고 돌아오면 첫 셀만 정상적으로 함수가 적용되고, 나머지 셀은 변동 없다.
여기서는 setPreviewImageSize(), setPreviewImageShape(), setChartLabelView()가 모두 호출되지 않은 것으로 보아,
prepareForReuse()는 적절한 위치가 아닌 것 같다.
🥕 정리 ) prepareForReuse()는 셀이 reuse될 때만 불려오는 함수이다. (ex. 바닥 찍는 경우)
따라서 셀을 커스터마이징하는 함수를 호출하기 적합하지 않다.
Try 3️⃣ - awakeFromNib 👉 ⭕️
세 번째 테스트다.
이번에는 cell 파일을 생성할 때 자동으로 불려와지는 setSelected(_:animated:) 함수에 넣어보았다.
결과는 성공이다.
🥕 정리 ) xib에서 작업했을 경우 대개 awakeFromNib() 에서 셀을 커스터마이징한다.
🥕 정리 ) 코드로만 작업했을 경우 init()에서 셀을 커스터마이징한다.
+) init 함수가 복잡하기 때문에,TableView에 cell 하나 던져두고
코드로 뷰와 제약조건 함수 정의한 후에
awakeFromNib()에서 호출하면 편하다고 한다!! (참고: Oripresso)
Try 4️⃣ - setSelected(_:animated:) 👉 ❌
마지막 테스트다.
이번에도 cell 파일을 생성할 때 자동으로 불려와지는 setSelected(_:animated:) 함수에 넣어보았다.
결과는 성공이다.
그러나,
setSelected(_:animated:)는 셀의 선택 여부에 따라 실행되는 성질을 가진 함수이므로,
초기에 한 번 셀을 설정하는 코드를 실행하기에는 적합하지 않다.
💚 결론 및 제안사항
튜터님, 팀원분께 확인한 결과,
1. 위 4개의 시도 중, awakeFromNib()에서 호출하는 게 가장 적절하다.
2. 코드 가독성을 위해 뷰, 제약조건 함수를 setupView(), setupConstraints() 등의 함수로 묶자.
(전)
(후)