스토리보드에서 Cell의 콘텐츠 구성하기
테이블은 디폴트로 하나의 Cell을 가지고 있는데 프로토타입 Cell의 attribute에서 값을 변경해서 추가할 수 있다.
Cell의 내용과 함께 다음의 속성들도 구성해줘야 한다.
var reuseIdentifier: String? { get }
reuseIdentifier
을 통해 Table View Delegate가 테이블뷰의 row로 재사용하기 위한 UITableViewCell
개체와 연결한다.
init(frame:reuseIdentifier:)
메서드에서 cell 개체에 할당된 후 변경할 수 없다.
UITableView
개체는 현재 재사용 가능한 cell의 큐를 유지하고 관리한다. 고유한 reuseIdentifier
를 가지며 dequeueReusableCell(withIdentifier:)
메서드에서 사용된다.
identifier로 구분한 후 재사용 가능한 Cell을 반환
func dequeueReusableCell(withIdentifier identifier: String) -> UITableViewCell?
TableView Data Source에서 테이블뷰에 대한 새로운 셀을 요청할 때 이 메서드를 호출한다. 이 메서드는 기존 셀에서 재사용 가능한 경우 큐에서 빼거나, nib 파일을 이용해 새로운 셀을 생성한다. 만약 재사용할 셀이 없고, nib 파일을 등록하지 않은 경우 nil
을 반환한다.
새로운 셀을 생성할 때는 init(style:reuseIdentifier:)
메서드를 호출해 셀을 초기화한다. 셀을 재사용하는 경우에는 해당 셀의 prepareForReuse()
메서드를 호출한다.
func dequeueReusableCell(
withIdentifier identifier: String,
for indexPath: IndexPath
) -> UITableViewCell
식별자와 함께 셀의 위치를 나타내는 IndexPath를 함께 받아 셀을 가져오는 메서드이다. 식별자에 맞는 기존 셀을 반환하거나 클래스나 스토리보드를 이용해 새로운 셀을 만들어서 반환한다. TableView Data Source의 tableView(_:cellForRowAt:)
에서만 사용가능하다. 다른 곳에서 셀을 생성하고 싶다면 dequeueReusableCell(withIdentifier:)
메서드를 사용해야 한다.
스토리보드에서 설정한 identifier와 일치해야 한다!
TableView Delegate가 셀을 재사용할 수 있도록 준비
func prepareForReuse()
dequeueReusableCell
메서드를 통해 셀이 재사용되기 전에 호출된다. 혹시 모를 성능 문제를 방지하기 위해 셀 내용과 관련 없는 셀의 속성(ex alpha, editing, and selection state)만 재설정 해야한다. TableVeiw Delegate는 tableView(_:cellForRowAt:)
메서드에서 셀을 재사용할 때 모든 내용을 재설정해야 한다.
성능상의 이유 -> 메모리 절약
모든 셀을 1:1로 메모리에 가지고 있는 것은 비효율적! 그래서 화면에 나타나는 셀만 메모리에 두고 셀의 틀을 재사용해서 내용만 바꾼다. 내용만 바꾸기 때문에 다른 속성 또한 재사용되어 예상치 못한 셀로 표현될 수 있으니 prepareForReuse
메서드에서 관련 속성을 재설정하거나 초기화하면 된다.
UITableViewCell
reuseIdentifier
prepareForReuse
dequeueReusableCell