Swift/TIL(TodayILearned)

[Swift|TIL] 240414 - (AppStore) 코드로 셀 커스터마이징하기 / cell이 재사용되기 전, 초기에 1번 호출하자 - awakeFromNib()

yurim-dev 2024. 4. 14. 17:40

💚 목표


스탠다드반 과제로 appstore 검색 뷰를 만드는 중이다.

아래 사진이 완성 뷰이다.

 


💚 진행 상황


⬇️ ViewController와 TableViewCell을 별도의 파일로 만들었고, 스토리보드에서 디자인했다.

 

 

⬇️ 한편, 스토리보드 인스펙터 영역에서 조작할 수 있는 기능이 한정적이라서

몇몇 객체의 디자인 및 제약조건은 코드로 구현했다.

 

⬇️ 뷰컨트롤러에서는 dataSource를 self로 설정, cell을 register했다.

DataSource 관련해서는 일단 행을 3개 불러오도록 했다.

 


💚 문제


현재 마주하고 있는 문제는

코드로 구현한 디자인/제약조건 함수를 어느 위치에서 호출해야 하는지이다.

 

 


💚 문제 해결


Try 1️⃣ - layoutSubviews() 👉 ❌

layoutSubviews() 에서 호출하면 첫 셀이 이상하게 보여진다.

 

그러나, 첫 셀에 setChartLableView()가 적용된 것으로 봐서,

코드는 정상적으로 실행되었으나, previewImage 부분에서 알 수 없는 문제가 발생한 것 같다.

 

한편, 테이블 뷰 바닥을 찍고 돌아오면 첫 셀이 정상적으로 바뀐다.

 

🥕 정리 ) layoutSubviews()는 불리는 타이밍이 여러번이고, 예측하기 어려운 함수이므로 

셀을 커스터마이징하는 함수를 호출하기 적합하지 않다.

 


Try 2️⃣ - prepareForReuse() 👉 ❌

공식문서(링크)에 따르면

재사용가능한 셀을 테이블에 추가하는 dequeueReusableCell(withIdentifier:for:)메소드는

셀의 prepareForReuse() 메소드를 호출한다고 한다.

https://developer.apple.com/documentation/uikit/uitableview/1614878-dequeuereusablecell

 

그래서 이번에는 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() 등의 함수로 묶자.

 

(전)

 

(후)