[iOS] UITableView 클래스

Kiwi·2024년 3월 25일

iOS

목록 보기
1/15
post-thumbnail

📁 UITableView

우리가 흔히 확인할 수 있는 리스트 형태의 뷰를 구현하기 위한 클래스이다. 이 테이블 뷰는 UI를 정의하고 DataSource와 Delegate를 통해 테이블의 내용을 관리한다. UITableView 클래스는 단순히 테이블 뷰의 인터페이스를 정의하고, 데이터를 표시하거나 사용자의 상호작용을 처리하지 않는다.

  • UITableView는 UIScrollView를 상속하고 있다. 즉, 테이블뷰를 구현하면 스크롤뷰를 따로 구현하지 않아도 그 기능을 사용할 수 있다.
  • UITableView는 DataSource와 Delegate를 지정하여 테이블 뷰에 데이터를 전달하고 뷰의 동작을 정의한다.
protocol UITableViewDataSource
protocol UITableViewDelegate

이 두 프로토콜을 채택하면 UITableView의 프로퍼티 중 dataSource와 delegate에 지정해주어야 한다. 예를 들어 extension으로 같은 클래스에 프로토콜을 채택해 구현하였다면 다음과 같이 지정해주어야 한다.

override func viewDidLoad() {
        super.viewDidLoad()
        todoTableView.dataSource = self
        todoTableView.delegate = self
    }

UITableView

UITableView도 하나의 타입으로 리스트뷰 테이블을 생성한다고 말했다. 타입인만큼 사용할 수 있는 프로퍼티와 메서드가 많다. 그 중 자주 쓰는 것 위주로 정리하자면

let tableView = UITableView()

위 코드로 가장 기본적인 UITableView를 생성할 수 있다.

//지정된 식별자 아래 테이블 뷰가 있는 셀을 포함하는 nib 개체를 등록
func register(UINib?, forCellReuseIdentifier: String)
//새 테이블 셀을 생성하는 데 사용할 클래스를 등록
func register(AnyClass?, forCellReuseIdentifier: String)
//지정된 재사용 식별자에 대해 재사용 가능한 테이블 뷰 셀 객체를 반환하고 이를 테이블에 추가
func dequeueReusableCell(withIdentifier: String, for: IndexPath) -> UITableViewCell
//식별자로 찾은 후 재사용 가능한 테이블 뷰 셀 객체를 반환
func dequeueReusableCell(withIdentifier: String) -> UITableViewCell?

테이블뷰에 셀을 등록하는 메서드는 다음과 같다. 여기서 말하는 재사용 가능한 셀이란 이전에 화면에 표시되었던 셀을 재활용하는 것을 말한다. UITableView는 스크롤되는 동안 화면에 보이는 셀만 생성하고 보여주는데, 셀이 화면에서 사라지면 해당 셀은 다시 사용할 수 있도록 재사용 큐에 들어간다. 그리고 스크롤 동작에 따라 셀을 재사용 큐에 넣고 꺼내는 동작이 반복된다.

apple 문서에 UITableView에 대해 잘 나와있다

UITableViewDataSource

UITableViewDataSource 프로토콜은 UITableView의 데이터 소스에 대한 메서드 및 속성을 정의하는 프로토콜이다. 이 프로토콜을 채택하여 구현해야만 UITableView에 표시되는 데이터를 제공하고 테이블 뷰의 동작을 정의할 수 있다. 이때 데이터 자체를 관리하는게 아니라 데이터 표시만 관리한다는 점!!!

이 프로토콜이 제공하는 메서드는 매우 다양한데 아래의 2개 메서드는 필수로 구현해야 하는 메서드이다.

//특정 섹션에 표시할 행의 수를 반환
func tableView(UITableView, numberOfRowsInSection: Int) -> Int
//특정 IndexPath에 대한 UITableViewCell을 반환
func tableView(UITableView, cellForRowAt: IndexPath) -> UITableViewCell

이외에도 다양한 메서드를 제공한다.

//테이블 뷰의 섹션 수를 반환
func numberOfSections(in: UITableView) -> Int

UITableViewDelegate

UITableViewDelegate 프로토콜은 UITableView의 동작을 사용자 정의하고 사용자의 상호 작용을 처리할 수 있다. 대표적으로 사용자의 행 선택에 응답한다.

//행이 선택되었음을 알림
func tableView(UITableView, didSelectRowAt: IndexPath)
//지정된 행이 선택 취소되었음을 알림
func tableView(UITableView, didDeselectRowAt: IndexPath)

또한 테이블 뷰의 헤더 및 푸터에 사용자 정의 뷰를 제공해주는 메서드도 제공한다.

//특정 섹션의 헤더에 표시할 사용자 정의 뷰를 요청
func tableView(UITableView, viewForHeaderInSection: Int) -> UIView?
//특정 섹션의 푸터에 표시할 사용자 정의 뷰를 요청
func tableView(UITableView, viewForFooterInSection: Int) -> UIView?

테이블 뷰의 행, 헤더, 푸터의 높이도 지정할 수 있다.

//지정된 위치의 행에 대한 높이를 요청
func tableView(UITableView, heightForRowAt: IndexPath) -> CGFloat
//특정 섹션의 헤더(header)에 대한 높이를 요청
func tableView(UITableView, heightForHeaderInSection: Int) -> CGFloat
//특정 섹션의 푸터(footer)에 대한 높이를 요청
func tableView(UITableView, heightForFooterInSection: Int) -> CGFloat

테이블 뷰의 편집 모드와 관련된 여러 가지 메서드도 제공한다.

//테이블 뷰가 편집 모드로 전환되기 직전에 호출
func tableView(UITableView, willBeginEditingRowAt: IndexPath)
//테이블 뷰가 편집 모드에서 빠져나온 직후에 호출
func tableView(UITableView, didEndEditingRowAt: IndexPath?)
//특정 위치의 행에 대한 편집 스타일을 요청
func tableView(UITableView, editingStyleForRowAt: IndexPath) -> UITableViewCell.EditingStyle

이외에도 수많은 메서드를 제공하고 있다.! 공식문서를 읽어보는 것을 추천한다!!!

profile
🐣 iOS Developer

0개의 댓글