study record

[iOS] UITableView (UIKit - UITableView) 본문

iOS/iOS_Document

[iOS] UITableView (UIKit - UITableView)

asong 2022. 4. 18. 14:46

공식 문서 https://developer.apple.com/documentation/uikit/uitableview를 공부하며 작성한 글입니다.

 

UITableView

 하나의 열과 행들을 사용하여 데이터를 표현하는 View

 

@MainActor class UITableView : UIScrollView

 

Overview

iOS 에서 Table views는 하나의 열에서 컨텐츠를 수직으로 스크롤링하는 행들로 보여준다. 테이블의 각 행들은 앱의 컨텐츠들을 포함한다.

 

 

테이블들은 앱에서 계층적으로 조직화, 구조화되어 있는 데이터에 흔하게 사용된다. 계층적 데이터를 포함하는 앱들은 종종 테이블을 네비게이션 뷰 컨트롤러와 함께 사용한다. 계층의 다른 레벨들 사이에서 네비게이션을 활성화하여 사용한다. 예시로 설정 앱은 테이블과 네비게이션 컨트롤러를 시스템 설정을 관리하기 위해 사용한다.

 

UITableView는 테이블의 기초적인 외관을 관리한다. 그러나 실제 컨텐츠를 보이기 위해 셀을 제공한다. (UITableViewCell 객체들). 표준 셀 configurations는 텍스트와 이미지들의 단순 조합을 보여준다. 커스텀 셀을 통해 원하는 컨텐츠를 보이도록 할 수 있다. 또한 헤더와 푸터 뷰를 추가로 사용해 셀들의 그룹을 위한 추가 정보를 제공할 수도 있다.

 

Adding a TableView to Your Interface

테이블뷰를 인터페이스에 추가하기 위해서는 스토리보드에 table view controller를 드래그한다. Xcode는 view controller와 table view 사이를 포함하는 새로운 scene을 창조했다.

 

Table 뷰들은 데이터를 요구하여 보통 제공하고자 하는 데이터를 data source 객체를 통해 얻는다. data source 객체는 앱의 데이터를 관리하고 테이블의 셀들을 만들어내는데에 책임이 있다. 만약 테이블의 컨텐츠가 절대로 변화하지 않는다면 스토리보드 파일의 컨텐츠에 설정할 수 있다.

 

Saving and Restoring the Table's Current State

테이블 뷰는 UIKit 앱 저장을 지원한다. 테이블의 데이터를 저장하고 복구하기 위해서 table view의 restorationIdentifier 속성에 nonempty 값을 할당한다. 부모 view controller에 저장할 때, 테이블 뷰는 자동적으로 현재 선택되고 보여지는 행들의 index paths를 저장한다. 만약 테이블의 data source 객체가 UIDataSourceModelAssociation 프로토콜을 채택한다면 테이블은 index paths 대신에 아이템들에 제공하는 독특한 ID를 저장한다.

 

 

Topics

테이블뷰 만들기

// table view를 특정 frame과 style로 만들고 리턴한다.
init(frame: CGRect, style: UITableView.Style)

// table view 객체를 data로부터 만든다.
init?(coder: NSCoder)

테이블 데이터와 셀 제공

// 테이블 뷰의 데이터 소스로서 행동하는 객체
var dataSource: UITableViewDataSource?

// 테이블뷰를 위한 prefetching 데이터 소스를 제공하는 객체. 다가오는 셀 데이터 요구사항의 알림을 받는다.
var prefetchDataSource: UITableViewDataSourcePrefetching?

// 테이블 뷰를 위한 셀을 제공하고, 데이터를 관리하는 메서드
protocol UITableViewDataSource

// 테이블 뷰를 위한 데이터 요구사항의 미리 경고를 제공하는 프로토콜로, 잠재적으로 일찍 long-running 데이터 작동을 시작하도록 허락한다.
protocol UITableViewDataSourcePrefetching

테이블 뷰 셀 재활용

// 특정 identifier로 셀을 포함하는 nib 객체를 등록
func register(UINib?, forCellReuseIdentifier: String)

// 새 테이블 셀을 창조하여 사용하는 클래스 등록
func register(AnyClass?, forCellReuseIdentifier: String)

// 특정 reuse identifier로 재사용가능한 테이블뷰 셀을 리턴하고 테이블에 더한다.
func dequeueReusableCell(withIdentifier: String, for: IndexPath) -> UITableViewCell

// identifier에 의해 위치시키고 재사용가능한 테이블 뷰 셀 객체를 리턴한다.
func dequeueReusableCell(withIdentifier: String) -> UITableViewCell?

섹션 헤더와 푸터 재활용

// 특정 식별자로 헤더와 푸터를 포함하는 nib 객체 등록
func register(UINib?, forHeaderFooterViewReuseIdentifier: String)

// 새로운 헤더, 푸터 뷰를 창조하여 사용하는 클래스 등록
func register(AnyClass?, forHeaderFooterViewReuseIdentifier: String)

// 식별자로 위치시키고 헤더, 푸터 뷰를 리턴
func dequeueReusableHeaderFooterView(withIdentifier: String) -> UITableViewHeaderFooterView?

테이블의 상호작용 관리

// 테이블뷰의 delegate로서 행동하는 객체
var delegate: UITableViewDelegate?

// 테이블 뷰에서 선택을 관리하고 섹션 헤더와 푸터를 설정하고 셀 삭제, 재순서 조절, 등 여러 행동을 관리
protocol UITableViewDelegate

테이블 외관 설정

// 테이블 뷰의 스타일
var style: UITableView.Style

// 테이블 뷰 스타일의 constant
enum UITableView.Style

// 테이블 컨텐츠 위에 보여지는 뷰
var tableHeaderView: UIView?

// 테이블 컨텐츠 아래에 보여지는 뷰
var tableFooterView: UIView?

// 테이블 뷰의 배경 뷰
var backgroundView: UIView?

셀 높이와 레이아웃 설정

// 테이블 뷰의 각 행의 포인트들의 기본 높이
var rowHeight: CGFloat

// 테이블 뷰의 행들의 추정 높이
var estimatedRowHeight: CGFloat

// 읽을 수 있는 컨텐츠 가이드로부터 얻어진 셀 마진이 보여지는지의 Boolean 값
var cellLayoutMarginsFollowReadableWidth: Bool

// safe area에 맞게 셀과 헤더, 푸터의 컨텐츠 뷰가 테이블 뷰에 맞을지를 보여주는 Boolean 값
var insetsContentViewsToSafeArea: Bool

헤더, 푸터 외관 설정

// 테이블 뷰의 섹션 헤더의 높이
var sectionHeaderHeight: CGFloat

// 테이블 뷰의 섹션 푸터의 높이
var sectionFooterHeight: CGFloat

// 테이블 뷰의 섹션 헤더들의 추정 높이
var estimatedSectionHeaderHeight: CGFloat

// 테이블 뷰의 섹션 푸터들의 추정 높이
var estimatedSectionFooterHeight: CGFloat

// 각 섹션 헤더위에 패딩의 양
var sectionHeaderTopPadding: CGFloat

separator 외관 커스텀

// sepatator로 사용되는 테이블 셀의 스타일
var separatorStyle: UITableViewCell.SeparatorStyle

// 분리자로 사용되는 셀의 스타일
enum UITableViewCell.SeparatorStyle

// 테이블 뷰의 분리 행들의 색깔
var separatorColor: UIColor?

// 테이블 분리자로 적용되는 효과
var separatorEffect: UIVisualEffect?

// 셀 분리자의 기본 inset
var separatorInset: UIEdgeInsets

// 분리 inset 값으로 해석하는 방법을 나타내는 것
var separatorInsetReference: UITableView.SeparatorInsetReference

// 테이블 뷰의 분리 inset 값을 해석하는 방법을 보여주는 constant
enum UITableView.SeparatorInsetReference

행들과 섹션들의 숫자를 얻기

// 특정 섹션의 행들의 수를 리턴
func numberOfRows(inSection: Int) -> Int

// 테이블 뷰의 섹션들의 수
var numberOfSections: Int

셀들과 섹션에 기초한 뷰 얻기

// 특정 index path의 셀을 리턴
func cellForRow(at: IndexPath) -> UITableViewCell?

// 특정 섹션의 헤더 뷰를 리턴
func headerView(forSection: Int) -> UITableViewHeaderFooterView?

// 특정 섹션을 위한 푸터 뷰 리턴
func footerView(forSection: Int) -> UITableViewHeaderFooterView?

// 특정 테이블 뷰 셀의 행과 섹션을 나타내는 index path를 리턴
func indexPath(for: UITableViewCell) -> IndexPath?

// 특정 포인트에서 행과 섹션을 나타내는 indexpath 리턴
func indexPathForRow(at: CGPoint) -> IndexPath?

// 특정 직사각형을 가지는 행을 나타내는 index path들의 배열 리턴
func indexPathsForRows(in: CGRect) -> [IndexPath]?

// 테이블 뷰에 보이는 테이블 셀들
var visibleCells: [UITableViewCell]

// 테이블 뷰의 보이는 행을 나타내는 index path들의 배열
var indexPathsForVisibleRows: [IndexPath]?

행 선택

// 선택된 행의 섹션과 행을 나타내는 Index path
var indexPathForSelectedRow: IndexPath?

// 선택된 행들을 나타내는 index paths
var indexPathsForSelectedRows: [IndexPath]?

// 테이블 뷰의 위치에 행을 스크롤링하고 index path를 나타내는 테이블 뷰의 행 선택
func selectRow(at: IndexPath?, animated: Bool, scrollPosition: UITableView.ScrollPosition)

// 선택 해제 애니메이션 옵션과 함께 인덱스 패스가 나타내는 행 선택 해제
func deselectRow(at: IndexPath, animated: Bool)

// 유저가 행을 선택할 수 있을지 여부를 나타내는 Boolean 값
var allowsSelection: Bool

행과 섹션의 삽입, 삭제, 이동

// 테이블뷰에 index paths 식별자 어레이들의 위치에 행들을 삽입, 삽입시 애니메이션 선택 여부
func insertRows(at: [IndexPath], with: UITableView.RowAnimation)

// index paths 배열의 행들을 삭제, 애니메이션 여부 선택
func deleteRows(at: [IndexPath], with: UITableView.RowAnimation)

// 테이블뷰에 하나 이상의 섹션들 삽입, 삽입시 애니메이션 여부 선택
func insertSections(IndexSet, with: UITableView.RowAnimation)

// 테이블뷰의 섹션들 삭제, 애니메이션 선택
func deleteSections(IndexSet, with: UITableView.RowAnimation)

// 행 삽ㅇ비, 삭제시 사용되는 애니메이션 타입
enum UITableView.RowAnimation

// 특정 위치로 행 이동, 목적지 위치
func moveRow(at: IndexPath, to: IndexPath)

// 테이블뷰에 새 위치로 섹션 이동
func moveSection(Int, toSection: Int)

행과 섹션의 업데이트 수행

// 그룹으로 삽입, 삭제, reload, 이동 작업들의 활성화
func performBatchUpdates((() -> Void)?, completion: ((Bool) -> Void)?)

// 테이블뷰의 행과 섹션들의 삽입, 삭제, 선택 메서드 호출을 시작
func beginUpdates()

// 테이블뷰의 행, 섹션들의 삽입, 삭제, 선택, reload 메서드 호출을 끝낸다.
func endUpdates()

테이블뷰 Reload

// 테이블뷰가 데이터 소스에서 보여지지 않는 변화를 포함하고 있는지의 Boolean 값
var hasUncommittedUpdates: Bool

// 행들에 존재하는 셀들을 보존하고, 특정 index paths의 행들의 데이터를 업데이트
func reconfigureRows(at: [IndexPath])

// 테이블뷰의 행과 섹션들을 리로드
func reloadData()

// 제공된 애니메이션 효과를 사용하여 특정 행들을 리로드
func reloadRows(at: [IndexPath], with: UITableView.RowAnimation)

// 제공된 애니메이션 효과를 사용해 특정 섹션들을 리로드
func reloadSections(IndexSet, with: UITableView.RowAnimation)

// 테이블 뷰의 오른쪽 사이드를 따라 인덱스 바의 아이템들을 리로드
func reloadSectionIndexTitles()