UITableViewDelegate
tableView를 사용하면서 관리해야 하는 부분들에 대한 메서드들을 protocol로 분리해두었다. tableView를 사용하는 곳에서 UITableViewDelegate를 채택한 후 필요한 메서드를 구현해야 한다.
UITableViewDelegate에 있는 메서드들은 tableView에서 다음과 같은 항목을 컨트롤해야 할 때 사용된다.
- Custom header와 footer view를 생성하고 관리할 때
- row, header, footer의 높이를 관리하고 싶을 때
- 더 나은 스크롤링을 위해 height estimate를 제공하고 싶을 때
- Indet row content (행 들여쓰기?)
- row를 선택했을 때 해야 하는 동작들을 관리하고 싶을 때
- row를 선택하는 것 이외에도 스와이프와 같은 액션들에 대한 설정을 하고 싶을 때
- table 컨텐트를 수정하는 것을 지원하고 싶을 때(? 원문은 Support editing the table's content.)
엑스 코드에서 command + shift + o를 눌러 UITableViewDelegate를 검색하면 프로토콜의 정의를 확인할 수 있다.
대충 봤는데도 어마어마한 양의 메서드들이 있다. 모든 메서드를 다 확인해볼 순 없겠지만 다음 포스팅에서는 실제로 테이블 뷰를 만들고, UITableViewDelegate의 메서드들이 어떻게 사용되는지 코드로 테스트해봐야겠다.
UITableViewDataSource
테이블 뷰를 사용하는 곳에서 UITableViewDataSource를 채택해야 비로소 데이터를 관리할 수 있다. 테이블 뷰 자체에서는 보여주어야 하는 데이터를 보여주는 것만 신경 쓰지 데이터 자체는 관리하지 않는다. 그래서 테이블 뷰를 사용하는 Controller에서는 UITableViewDataSource를 채택해서 테이블 뷰가 보여줄 데이터를 관리해야 한다. 아래는 어떤 것들을 테이블 뷰에게 알려주는지를 나열했다.
- 테이블 뷰의 section 수와 row의 수
- 테이블뷰의 각 row에서 사용할 cell을 알려줘야 한다
- section의 header와 footer의 title도 알려줘야 한다
- Configuring the table's index, if any. (tableview의 index가 있는 경우 configure?)
- Responding to user- or table-initiated updates that require changes to the underlying data.
UITableViewDataSource도 들어가 보면 엄청 많은 메서드들이 있는데,
UITableViewDelegate에서는 모두 optional로 되어있어서 필요한 메서드만 구현하면 되었는데 UITableViewDataSource에서는 두 가지 메서드가 required로 지정되어있어서 UITableViewDataSource를 채택하는 경우는 아래 두 메서드를 꼭 구현해주어야 한다.
// Return the number of rows for the table.
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
// Provide a cell object for each row.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
section에 행이 몇 개가 들어가야 하는지, 그 행에는 어떤 데이터(cell)가 들어가야 하는지 정도는 알아야 테이블 뷰도 데이터를 노출시켜 줄 수 있으니 이 두 메서드는 꼭 필요한 게 맞을 것 같다. (section이 몇 개인지는 중요하지 않은가 보다. numberOfSectionsInTableView 메서드를 구현하지 않는 경우 Default로 1이 지정된다.)
Specifying the Location of Rows and Sections
테이블 뷰에서 section과 row의 위치를 사용해야 할 때는 IndexPath를 사용한다. IndexPath의 convenience init으로 init(row:section:)을 사용할 수 있다. (section안에 row가 있다고 이해하는데 왜 row가 먼저 나올까..?)
위 사진으로 따져보면 Siri & Search는 0번째 section의 0번째 row, Language는 1번 section의 0번 row로 볼 수 있다.
다음 포스팅에서는 직접 tableView를 코드로 짜 보고 UITableViewDataSource와 UITableViewDelegate의 메서드들이 어떻게 사용되는지 확인해봐야겠다.
'iOS' 카테고리의 다른 글
[iOS] UITableView 예제 코드 만들기 2 - Custom UITableViewCell xib 파일로 만들기 (0) | 2021.10.13 |
---|---|
[iOS] UITableView 예제 코드 만들기 1 (0) | 2021.10.12 |
Apple Developer Documentation에서 API Changes 확인하기 (0) | 2021.10.07 |
[iOS] UITableView 알아보기 (1) - UITableView, UITableViewCell이 뭐야? (0) | 2021.10.05 |
[iOS] UIView에 border 추가하기 / 모서리 둥글게 하기 - 코드, 스토리보드 (0) | 2021.09.09 |