일정한 형태의 화면 구성이 반복되며 리스트에 포함되어 있다 → UITableView & Cell로 구현 가능하다. ex) 카톡 대화 창, 인스타그램 피드
리스트 형태를 지니고 있으며, 스크롤이 가능하다(수직으로만).
섹션을 이용해 행을 시각적으로 구분 할 수 있다.
섹션의 헤더와 푸터에 이미지나 텍스트를 이용하여 추가적인 정보를 보여줄 수 있다.
프로토콜 내에 메서드들이 선언되어 있는 모습 → optional이 붙었기 때문에 필수 구현 메서드가 아니다
UITableViewDelegate 프로토콜의 주요 메서드
// 지정된 행이 선택되었음을 알리는 메서드
func tableView(UITableView, didSelectRowAt: IndexPath)
// 지정된 행의 선택이 해제되었음을 알리는 메서드
func tableView(UITableView, didDeselectRowAt: IndexPath)
// 특정 위치 행의 높이를 묻는 메서드
func tableView(UITableView, heightForRowAt: IndexPath)
// 특정 위치 행의 들여쓰기 수준을 묻는 메서드
func tableView(UITableView, indentationLevelForRowAt: IndexPath)
// 특정 섹션의 헤더뷰 또는 푸터뷰를 요청하는 메서드
func tableView(UITableView, viewForHeaderInSection: Int)
func tableView(UITableView, viewForFooterInSection: Int)
// 특정 섹션의 헤더뷰 또는 푸터뷰의 높이를 물어보는 메서드
func tableView(UITableView, heightForHeaderInSection: Int)
func tableView(UITableView, heightForFooterInSection: Int)
// 테이블뷰가 편집모드에 들어갔음을 알리는 메서드
func tableView(UITableView, willBeginEditingRowAt: IndexPath)
// 테이블뷰가 편집모드에서 빠져나왔음을 알리는 메서드
func tableView(UITableView, didEndEditingRowAt: IndexPath?)
프로토콜 내에 메서드들이 선언되어 있는 모습 → cellForRowAt & numberOfRowsInSection 은 optional이 붙지 않았기 때문에 필수 구현 메서드이다
UITableViewDataSource 프로토콜의 주요 메서드
@required
**// 특정 위치에 표시할 셀을 요청하는 메서드**
func tableView(UITableView, cellForRowAt: IndexPath)
**// 각 섹션에 표시할 행의 개수를 묻는 메서드**
func tableView(UITableView, numberOfRowsInSection: Int)
@optional
// 테이블뷰의 총 섹션 개수를 묻는 메서드
func numberOfSections(in: UITableView)
// 특정 섹션의 헤더 혹은 푸터 타이틀을 묻는 메서드
func tableView(UITableView, titleForHeaderInSection: Int)
func tableView(UITableView, titleForFooterInSection: Int)
// 특정 위치의 행을 삭제 또는 추가 요청하는 메서드
func tableView(UITableView, commit: UITableViewCellEditingStyle, forRowAt: IndexPath)
// 특정 위치의 행이 편집 가능한지 묻는 메서드
func tableView(UITableView, canEditRowAt: IndexPath)
// 특정 위치의 행을 재정렬 할 수 있는지 묻는 메서드
func tableView(UITableView, canMoveRowAt: IndexPath)
// 특정 위치의 행을 다른 위치로 옮기는 메서드
func tableView(UITableView, moveRowAt: IndexPath, to: IndexPath)
테이블뷰의 Delegate와 DataSource의 관계 표현
func tableView(UITableView, cellForRowAt: IndexPath)
→ dequeReusableCell: 재사용 가능한 셀을 큐에서 빼낸다. 말그대로 실제로 재사용 가능한 큐에서 특정 identifier의 셀을 가져오는 메소드이다
iOS 기기는 메모리가 무한정 있는 것이 아니기 때문에 반복된 뷰를 생성할 때는 뷰를 재사용하여 메모리를 절약하는 것이 좋다.
따라서 다음과 같은 원리를 이용해 UITableViewCell 이나 UICollectionViewCell을 재사용 한다.
셀의 구조는 위의 그림과 같이 컨텐츠 영역과 액세서리뷰 영역으로 나뉜다.
UITableViewCell 클래스를 상속받는 기본 테이블뷰 셀은 표준 스타일을 이용할 수 있다.
표준 스타일 UITableViewCell 클래스는 셀 콘텐츠에 세 가지 프로퍼티가 정의되어 있다.
UITableViewCell 클래스에서 기본 형태를 벗어나 다양한 애플리케이션의 요구를 충족시키기 위해 셀을 커스텀 할 수 있다. 셀을 커스텀 하면 이미지를 텍스트 오른쪽에 위치시키는 등 원하는 시각적 형태를 만들 수 있다.
awakeFromNib()
Interface Builder archive 또는 nib 파일이 생성된 후 초기화 작업을 준비하는 곳
간단히 말해 셀을 가장 처음에 초기화 하는 작업이다.
tableView(_:cellForRowAt)
TableView의 특정 위치에 삽입할 Cell에 대해 DataSource에 요청하는 메서드
구현 시 테이블뷰의 dequeReusableCell(withIdentifier: for:) 메서드를 통해 지정된 indexPath로 적절하게 셀을 생성한다(메모리에 로드된다).
tableView(_:willDisplay:forRowAt:)
Delegate가 셀 객체를 그리기 전에 호출되는 함수
화면에 보여지기 직전에 작업을 수행함
prefetch
UITableViewDataSourcePrefetching
TableView와 CollectionView에 사용할 수 있는 UITableViewDataSourcePrefetching 프로토콜이다.
디스플레이에 보여지는 셀 이외의 셀의 정보를 미리 호출하여 데이터를 받아올 수 있다.
→ 즉, 화면에 보이지 않는 나머지 셀 들의 정보를 받을 수 있다.
필수적으로 구현해야 하는 함수:
prefetchRowsAt
cancelPrefetchingForRowsAt:
tableView(_:didEndDisplaying:forRowAt:)
테이블뷰로부터 cell이 화면에 사라지면 호출되는 메서드
prepareForReuse()
테이블뷰 Delegate에 의해 재사용 가능한 셀을 준비하는 메서드
awakeFromNib에 의해 화면에 보이는만큼 셀의 갯수를 생성 → 그 이후 큐에 넣어졌던 셀을 재사용하므로 더 이상 셀을 생성하는 것이 아니라 재사용하는 메커니즘을 사용!
+) 특정 셀에 특정 정보를 넣을 때 사용하는 IndexPath
indexPath의 row를 참조해야 하는 이유: 첫 번째 0은 테이블 뷰의 section에 대한 정보이고 두 번째 숫자는 section의 행에 대한 정보이다. 따라서 indexPath.row를 사용해야 행에 대한 정보인 두 번째 숫자를 참조할 수 있다.
테이블 뷰와 거의 똑같다
이 프로토콜은 컬렉션 뷰 내에서 셀들의 사이즈나 셀들 사이의 spacing을 정의해주며 프로토콜 내의 메서드들은 전부 선택적이다.
프로토콜 내의 메서드들