[iOS] TableViewController

Seonhu Kim·2023년 3월 31일
0

iOS

목록 보기
8/16
post-thumbnail

아마 이번 포스팅은 기본적인 TableView의 구조와 개념에 대해 정리하고, TableView를 활용한 웹서버 통신(JSON Parsing), Alamofire 라이브러리 사용까지 정리하고자 한다.

TableView

  • 테이블 뷰 컨트롤러의 역할은 단순하게 목록 형태의 컨텐츠를 화면에 표현해주는 것이지만, 계층 구조를 이루는 컨텐츠의 상위 카테고리를 정렬해 표현함으로써 앱이 제공하는 컨텐츠가 방대하더라도 사용자가 원하는 컨텐츠를 쉽게 접근할 수 있도록 함
  • TableView Controller와 Navigation Controller는 계층적 성격의 컨텐츠를 표현해주기 위해 상호 보완적인 역할을 함

테이블 뷰의 Hierarcy

  • TableViewController
    • Table View (다중의 리스트를 가질 수 있음)
      • Table View Cell (하나의 행)
        • Content View

Prototype Cell

  • 스토리보드 파일에서 테이블 뷰의 셀을 직접 수정하여 원하는대로 쉽게 디자인할 수 있도록 하는 객체 (설계 시간 단축)
  • Cell Content : 셀에 표현될 컨텐츠
  • Accessory View : 컨텐츠의 부가정보 암시

DataSource : TableView에 연결되어 화면에 표시될 상세 컨텐츠

  1. TableView에는 데이터 소스를 연결하거나 그렇지 않으면 Static TableView로 구성해야 화면에 정상적으로 표시됌
  2. Static TableView란 TableViewCell을 프로그래밍적으로 구성하지 않고, 직접 작성한 것을 의미함

TableView와 Data Source를 연동하려면 다음 메서드를 구현해야함

  • numberOfSections(in tableView:) : TableView에 필요한 그룹의 갯수를 리턴할 수 있다. 구현하지 않아도 1을 리턴함
  • tableView(_ tableView: numberOfRowsInSection section:) : 특정 섹션내에 셀의 갯수를 리턴함

    • 개발자가 사용하기 위한 것이 아닌 시스템이 사용하기 위한 메서드 → 몇 개의 행을 생설할 지 iOS 시스템이 알기 위해 호출
  • tableView(_ tableView: cellForRowAt indexPath:) : 실제로 셀의 컨텐츠를 생성해서 셀을 리턴하는 메서드

    • 개별 행을 구성하기 위한 목적으로 각 행 하나를 실제로 만들어 화면에 표현하는 시점에 호출 (몇 개의 행을 생성해야 하는지 반환받고, 이 메서드를 그 수만큼 호출함)
  • tableView(_ tableView: didSelectRowAt indexPath:) : TableView에서 셀을 선택한 경우 이벤트 처리를 담당함

테이블뷰 셀의 재사용 메커니즘에 대하여


1. 테이블 뷰가 화면에 셀을 표시하기 위해 자신의 데이터 소스에 요청함
2. 데이터 소스는 테이블 뷰의 재사용 큐(Reuse Queue)에서 사용 가능한 셀이 있는지 확인해서 있으면 꺼내서 사용하고 없으면 새로운 셀을 생성
3. 셀을 원하는 방식으로 구성한 다음 반환하면 테이블 뷰가 이 셀을 받아 화면에 표시함
4. 사용자가 테이블 뷰를 스크롤함에 따라 화면을 벗어난 셀은 테이블 뷰에서 제거되지만, 완전히 삭제하는 것이 아니라 재사용 큐에 추가

dequeueReusableCell (재사용 셀)

테이블 뷰가 표시하는 뷰는 내용만 다를 뿐 모양은 반복된다.

  • tableView: cellForRowAt:에서는 테이블 뷰 내부에 있는 버퍼를 이용해 메모리를 효율적으로 사용하는 기법

  • 화면 밖으로 사라지는 테이블 셀을 임시로 지니고 있다가 새로 그려야하는 셀을 만들기 전에 재사용 큐를 먼저 확인함 → 동일한 셀이 있으면 이미 만들어진 재사용 큐에 있는 테이블 뷰 셀에 값을 바꿔서 테이블 뷰에 넣어줌

viewWithTah 메서드를 활용하여 cell 확인

  • Storyboard에서 설정한 Tag 항목 값을 이용해서 객체를 읽어 올 수 있음 (IBOutlet 대체 가능)
  • let name = cell.viewWithTag(101) as? UILabel (cell의 101 태그가 찍힌 View를 UILabel 타입으로 다운 캐스팅한다.)
profile
iOS Developer.

0개의 댓글