개발+IT

UITableView에 커스텀 셀 편하게 등록하기

protocol + extension = 😎

iOS 개발을 하다보면 테이블뷰(컬렉션뷰)를 필연적으로 자주 쓰게 된다. 이때 다양한 디자인에 대응하기 위해 커스텀 셀을 많이 만들게 되는데, 테이블뷰에서 해당 커스텀 셀을 사용하기 위해서는 UITableView.register 라는 함수를 써서 미리 셀을 등록해야 한다. 이 때 register 함수는 두가지 종류가 있는데,

위의 두 함수다. 인터페이스 빌더로 만든 셀의 경우에는 위 함수를 쓰고 깡 코드로 만든 셀의 경우에는 아래 함수를 쓴다. 개발 초기에야 내가 지금 넣으려는 커스텀 셀이 뭘로 만들어졌는지를 잘 기억하고 있겠지만, 프로젝트의 복잡도가 올라갈수록 혹은 개발 기간이 길어질수록 아 이게 뭐였더라 하면서 커스텀 셀 클래스를 기어이 찾아 들어가서 확인해야만 하는 경우가 많아진다. 그렇게 몇번을 뷰컨트롤러와 셀 파일을 왔다리 갔다리 하던 차에, 도저히 귀찮아서 안되겠다 싶어 자구책을 마련해보았다. 일단 다음과 같은 프로토콜을 하나 선언해준다.

  • UITableViewRegisterable → 테이블뷰에 등록할 수 있는 애 라는 뜻
  • cellId → 나중에 dequeueReusableCell 함수에서 해당 셀을 생성하기 위해 쓰이는 애
  • isFromNib → 인터페이스 빌더로 만들었는지, 깡 코드로 만들었는지를 반환할 애
  • register(target: UITableView) → 등록 동작을 수행할 함수

잘 보면 모든 것이 static으로 선언되어있다는 것을 알 수 있는데, 왜냐면 해당 프로토콜을 구현하는 주체가 커스텀 셀이지만 인스턴스화되지 않은 상태에서 만들어야 하기 때문이다. 뭐 그래봐야 짧은 문자열, 불, 함수 하나이니 그렇게까지 부담되진 않을것이다...

그래서 커스텀 셀에서 바로 저걸 구현하면 되느냐? 그것은 아니고 저 프로토콜의 익스텐션을 하나 만들어줘야 한다.

UITableViewRegisterable 프로토콜을 구현하는 주체가 UITableViewCell일 경우, register 함수가 동작해야하는 로직 자체는 똑같기 때문에 익스텐션에서 구현해준다. 보면 함수 내에서 (구현될) isFromNib에 따라 register 함수를 달리 호출하고, ReuseIdentifier 역시 (구현될) cellId 값을 사용한다. 이러면 커스텀 셀에서의 프로토콜 구현이 다음과 같이 간단해진다.

register 함수는 익스텐션을 통해 미리 구현해두었으니 프로퍼티 두개만 설정해주면 오케이다. 그럼 이제 테이블뷰를 설정하는 부분에서 다음과 같이 호출할 수 있다.

이런 식으로 아주 간단해진다. 별거 아닌 짧은 코드지만 꽤 유용하게 쓰고 있다. 아직까지 큰 문제는 없이 쓰고 있는데 혹시 어떤 문제가 있다면 알려주시면 감사하겠다.

GAE BAL JA

구구리 님의 창작활동을 응원하고 싶으세요?

hell yeah, world
hell yeah, world
구독자 111
멤버십 가입

0개의 댓글

SNS 계정으로 간편하게 로그인하고 댓글을 남겨주세요.
새로운 알림이 없습니다.