Table View


개요

  • Table view
  • Table view cell
  • DataSource와 Delegate

Table view

iOS 애플리케이션에서 많이 활용하는 사용자 인터페이스이다. 테이블뷰는 리스트 형태를 지니고 있으며 스크롤이 가능해 많은 정보를 보여주기 용이하다.

기본 형태

  • 하나의 열(column)과 여러 줄의 행(row)을 지니며, 수직으로만 스크롤이 가능하다.
  • 각 행은 하나의 셀(cell)에 대응한다.
  • 섹션(section)을 이용해 행을 시각적으로 나눌 수 있다.
  • 헤더(header)와 푸터(footer)에 이미지나 텍스트를 추가해 추가 정보를 보여줄 수 있다.

스타일

크게 두 가지 스타일(일반, 그룹)로 나뉜다.

  • 일반 테이블뷰 (Plain TableView)
    • 더 이상 나뉘지 않는 연속적인 행의 리스트 형태
    • 하나 이상의 섹션을 가질 수 있으며, 각 섹션은 여러 개의 행을 지닐 수 있다.
    • 각 섹션은 헤더 혹은 푸터를 옵션으로 가질 수 있다
    • 색인을 이용해 빠른 탐색을 하거나 옵션을 선택할 때 용이하다.
  • 그룹 테이블뷰 (Grouped TableView)
    • 섹션을 기준으로 그룹화되어 있는 리스트 형태
    • 하나 이상의 섹션을 가질 수 있으며, 각 섹션은 여러 개의 행을 지닐 수 있다.
    • 각 섹션은 헤더 혹은 푸터를 옵션으로 가질 수 있다.
    • 정보를 특정 기준에 따라 개념적으로 구분할 때 적합
    • 사용자가 정보를 빠르게 이해하는 데 도움이 된다.

plain tableview grouped tableview

생성

스토리보드에서 커스텀 UITableViewController 클래스의 객체를 이용할 수 도 있고, 소스코드에서 생성하는 것도 가능하다. 스토리보드에서 테이블뷰의 특성을 지정할 때, 동적 프로토타입 또는 정적 셀 중 하나를 선택할 수 있다. 새로운 테이블뷰를 생성할 때 기본 설정 값은 동적 프로토타입이다.

  • 동적 프로토타입 (Dynamic Prototypes)
    • 셀 하나를 디자인해 이를 다른 셀의 템플릿으로 사용하는 방식
    • 같은 레이아웃의 셀을 여러 개 이용해 정보를 표시할 경우
    • UITableViewDataSource 인스턴스에 의해 콘텐츠를 관리하며, 셀의 개수가 상황에 따라 변하는 경우에 사용
  • 정적 셀 (Static cells)
    • 고유의 레이아웃과 고정된 수의 행을 가지는 테이블 뷰에 사용
    • 테이블뷰를 디자인하는 시점에 테이블의 형태와 셀의 개수가 정해져 있는 경우 사용
    • 셀의 개수가 변하지 않음

구성요소

테이블뷰를 구성하기 위해 꼭 알아야 하는 개념에는 cell, delegate, data source가 있다.

참고 링크

UITableView - UIKit - Apple Developer Documentation

Table View Programming Guide for iOS

Tables - Views - iOS Human Interface Guidelines


Table view cell

테이블뷰를 이루는 개별적인 행(row)으로, UITableViewCell 클래스를 상속받는다. UITableViewCell 클래스에 정의된 표준 스타일을 활용해 문자열 혹은 이미지를 제공하는 셀을 생성할 수 있으며, 커스텀 서브뷰를 올려 다양한 시각적 모습을 나타낼 수 있다.

구조

크게 콘텐츠 영여과 액세서리뷰 영역으로 구조가 나뉜다.

  • 콘텐츠 영역 : 셀의 왼쪽 부분에는 주로 문자열, 이미지 혹은 고유 식별자 등이 입력된다.
  • 액세서리뷰 영역 : 셀의 오른쪽 작은 부분은 액세서리뷰로 상세보기, 재정렬, 스위치 등과 같은 컨트롤 객체가 위치한다.

tableviewCell

테이블 뷰를 편집 모드로 전환하면 아래와 같은 구조로 바뀐다

  • 편집 컨트롤은 삭제 컨트롤또는 추가 컨트롤 중 하나가 될 수 있다.
  • 재정렬이 가능한 경우, 재정렬 컨트롤이 액세서리뷰에 나타난다.

tableviewCell edit mode

일반 셀의 기본 기능

  • UITableViewCell 클래스를 상속받는 기본 테이블뷰 셀은 표준 스타일을 이용할 수 있다. 표준 스타일의 콘텐츠 영역은 한 개 이상의 문자열 그리고 이미지를 지닐 수 있으며, 이미지가 오른쪽으로 확장됨에 따라 문자열이 오른쪽으로 밀려난다.
  • UITableViewCell 클래스는 셀 콘텐츠에 세 가지 프로퍼티가 정의되어 있다.
    • textLabel: UILabel
    • detailTextLabel: UILabel
    • imageView: UIImageVIew

커스텀 테이블뷰 셀

셀을 커스텀할 수 있다. 방법은 두 가지가 있는데, 스토리보드를 이용하거나 코드로 구현하는 방법이 있다.

참고 UITableViewCell의 서브클래스를 이용해 커스텀 이미지뷰를 생성하는 경우, 이미지뷰의 변수명을 imageView로 명명하면 기본 이미지뷰 프로퍼티의 변수명과 같아 이상하게 동작할 수 있으니, 네이밍에 유의하자.

참고 링크

UITableViewCell - UIKit - Apple Developer Documentation

Table View Programming Guide for iOS

Tables - Views - iOS Human Interface Guidelines


DataSource와 Delegate

MVC 모델에 따라 data source는 M과 관련되어 있으며, dalegate는 테이블뷰의 모양과 동작을 관리하기에 C의 역할에 가깝다. 테이블 뷰는 V의 역할을 한다. 이 둘 덕분에 테이블뷰를 매우 유연하게 만들 수 있다.

data source

  • UITableViewDataSource 프로토콜을 채택한다.
  • 테이블 뷰를 생성하고 수정하는데 필요한 정보를 테이블뷰 객체에 제공
  • 데이터 모델의 델리게이트로, 테이블뷰의 시각적인 모양에 대한 최소한의 정보를 제공
  • UITableView 객체에 섹션의 수와 행의 수를 알려주며, 행의 삽입, 삭제 및 재정렬하는 기능을 선택적으로 구현할 수 있다.
  • UITableViewDataSource 프로토콜의 주요 메서드는 아래와 같다. 이 중 @required로 선언된 두 가지 메서드는 이 프로토콜을 채택한 타입에 필수로 구현해야 한다.
 @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

  • UITableViewDelegate 프로토콜을 채택한다.
  • 테이블뷰의 시각적인 부분 수정, 행의 선택 관리, 액세서리뷰 지원 그리고 테이블뷰의 개별 행 편집을 도와준다.
  • 델리게이트 메서드를 활용하여 테이블뷰의 세세한 부분을 조정할 수 있다.
  • UITableViewDelegate 프로토콜의 주요 메서드는 아래와 같다.
 // 특정 위치 행의 높이를 묻는 메서드
 func tableView(UITableView, heightForRowAt: IndexPath)
 // 특정 위치 행의 들여쓰기 수준을 묻는 메서드
 func tableView(UITableView, indentationLevelForRowAt: IndexPath)

 // 지정된 행이 선택되었음을 알리는 메서드
 func tableView(UITableView, didSelectRowAt: IndexPath)

 // 지정된 행의 선택이 해제되었음을 알리는 메서드
 func tableView(UITableView, didDeselectRowAt: 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?)

참고 링크

Table View Programming Guide for iOS

UITableViewDataSource - UIKit - Apple Developer Documentation

UITableViewDelegate - UIKit - Apple Developer Documentation