leeyang의 개발 성장기
[Swift] TableViewCell identifier에 관하여 본문
안녕하세요 리양입니다 :)
최근에 기존에 했던 프로젝트를 리팩토링하면서 관심이 생긴 TableVIew의 Cell identifier에 얘기하고 싶어졌습니다.
TablewView는 요청할 때 마다 Cell을 생성하지 않고, 재사용 큐에 대기하고 있는 Cell이 있다면 재사용하고, 없으면 새로운 Cell을 생성합니다.
그 후 사용자가 스크롤 하여 더이상 화면에 보이지 않은 Cell은 재사용 큐에 들어갑니다.
*_UITableViewDataSource *_의 메소드인
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
에서
tableView.dequeueReusableCell(withIdentifier: "leeyang", for: indexPath)
을 하여 큐에서 꺼내 Cell을 사용하곤 합니다.
Cell을 재사용하기 위해서는 Cell을 미리 TableView에 register를 해야합니다.
register를 할 때 식별자인 identifier의 값에 따라 해당 Cell을 사용할 수 있죠.
꺼내는 건 공통이지만 등록은 Cell을 만드는 방식에 조금 다릅니다.
Cell을 만드는 방법은 총 3가지가 존재합니다
- code 2. xib 3. storyboard
storyboard는 자동으로 셀을 등록하기 때문에 별도의 등록을 하지 않아도 됩니다.
xib / code에 따라 오버로딩 된 두 메소드 중 하나를 택하여 register를 해야합니다.
등록과 사용을 알았으니 이제 아까 말한 식별자로 등록 후 꺼내야 하는데 저는 여기서 의문이 생겼습니다.
'한 tablewView에 2개 이상의 Cell들을 등록해야한다면 각 Cell들의 identifier를 상수로 가지고 있어야 할 필요가 있을까?' 였습니다.
이미 cell의 이름이 유니크한데, 그 이름으로 idenfitier를 타이핑 없이 알아서 자동으로 맵핑이 가능하다면, 코드의 귀찮음이 줄어 들지 않을 까 했습니다.
그래서 cell file name을 자동으로 등록하자란 아이디어가 떠올랐으며 사용해보았습니다.
Code
nib이름과 idenfitier를 computed 변수로 자기 자신을 string으로 반환하게 합니다.
만들어 놓은 Cell에 해당 Protocal을 상속합니다.
그러면 MainStoreListTableViewCell.nibname을 할 시 MainStoreListTableViewCell 로 값이 나옵니다.
extension 으로 register를 간단하게 랩핑합니다.
저는 cell을 재사용하기위해 xib를 사용하기에 nib부분만 변경해보았습니다. 제네릭으로 어떤 타입이든 상관없이 nib을 생성 후 레지하도록 합니다.
dequeue부분도 별도 identifier를 하지 않게 랩핑합니다.
tableView.register(MainStoreListTableViewCell.self)
tableView.dequeueReusableCell(forIndexPath: indexPath) as MainStoreListTableViewCell
로 별도의 식별자 상수 없이 클래스 네임으로 구분할 수 있게 되었습니다.
저는 식별자를 여기저기 써놓아서 통일성이 어긋나는 경우를 지양하고자 생각했습니다.
더 좋은 방법이 있으면 코멘트부탁드립니다 :)
'Swift' 카테고리의 다른 글
[Swift] ExpandableCell 만들기 (0) | 2019.09.15 |
---|---|
[Swift] 열거형 - enum 기본편 (0) | 2019.09.03 |
[Swift] for문 탐색을 거꾸로하기 (0) | 2019.09.01 |