소피it블로그

[UIKit] UITableViewDataSource 정리 본문

개발_iOS/UIKit

[UIKit] UITableViewDataSource 정리

sophie_l 2022. 8. 15. 11:50

https://developer.apple.com/documentation/uikit/uitableviewdatasource

 

Apple Developer Documentation

 

developer.apple.com

데이터를 관리하고 테이블 뷰에 셀을 제공하기 위해 객체가 채택하는 메서드

 

1. 선언

@MainActor protocol UITableViewDataSource

2. 개요

 

테이블 뷰는 데이터를 보여주는 것만 관리할 뿐, 데이터 그 자체를 관할하지는 않는다. 데이터를 관리하기 위해서는 데이터 소스 객체, 즉 UITableViewDataSource 프로토콜을 구현하는 객체를 테이블에 제공해야 한다. 데이터 소스 객체는 테이블로부터 데이터와 관련된 요청들에 응답한다. 또한, 테이블의 데이터를 직접적으로 관리하거나 앱에서 데이터를 관리하는 부분들과 상호작용하기도 한다. 데이터 소스 객체의 기능은 다음과 같다:

 

  • 테이블 내부의 섹션과 로우의 개수 세기
  • 테이블의 각 로우에 셀을 제공하기
  • 섹션 헤더와 푸터에 타이틀 제공하기
  • 테이블의 인덱스 구성하기(있는 경우)
  • 데이터의 변경을 유발하는 유저나 테이블로부터의 업데이트에 응답하기

이들 중 필수적으로 구현해야 하는 것은 두 가지이며, 다음 예시에서 확인할 수 있다.

// Return the number of rows for the table.     
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
   return 0
}

// Provide a cell object for each row.
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   // Fetch a cell of the appropriate type.
   let cell = tableView.dequeueReusableCell(withIdentifier: "cellTypeIdentifier", for: indexPath)
   
   // Configure the cell’s contents.
   cell.textLabel!.text = "Cell text"
       
   return cell
}

// 인덱스패스의 번호가 필요할 경우 indexPath.row 사용

테이블의 특정 기능들을 활성화하려면 이 프로토콜의 다른 메서드들을 사용하면 된다. 예를 들어 tableView(_:commit:forRowAt:) 메서드를 사용한다면 로우마다 스와이프해서 삭제하기 기능을 구현할 수 있다.

 

3. 로우와 섹션의 위치 구체화하기

 

테이블 뷰는 NSIndexPath 객체의 row와 section 프라퍼티를 통해 셀의 위치를 알아낸다. 로우와 섹션 인덱스는 제로 베이스이기 때문에 첫 번째 섹션은 인덱스 0으로 시작하며, 두 번째 섹션은 인덱스 1이 된다. 비슷하게 각 섹션의 첫 번째 로우 역시 인덱스가 0에서 시작하는데, 이는 로우 하나를 특정하기 위해서는 섹션과 로우 값이 둘 다 필요함을 의미한다. 테이블에 섹션이 없는 경우에는 로우 값만 있어도 된다.