본문 바로가기

iOS

[iOS] - UITableView

노션에서 정리하고 옮기니까 이상 이상...

UITableView 클래스

NSObject→UIResponder→UIView→UIScrollView→UITableView

  • 테이블 뷰는 수직으로 스크롤되는 컨텐츠를 표현합니다.
  • UITableViewCell을 이용하여 테이블 내의 컨텐츠를 만들 수 있습니다.

UITableView.Style

plain = 0

headers와 footers가 구분되어 표시되고 테이블이 스크롤됩니다.

headers가 스크롤에 맞춰서 움직임

grouped = 1

테이블 뷰가 스크롤 될때 headers와 footers가 같이 움직임

insetGrouped = 2

섹션별로 테두리가 둥글게 표시됩니다.

UITableVIewDelegate

행동에 대한 동작을 수행

  • 사용자 지정 header와 footer를 만들고 관리
    • 1. 지정된 섹션 헤더에 표시할 커스텀 뷰를 설정
    • 2. 지정된 섹션 푸터에 표시할 커스텀 뷰를 설정
    • 3. 헤더 뷰를 표시하려고 함을 알림
    • 4. 푸터 뷰를 표시하려고 함을 알림

 

 

  • 행의 높이, header와 footer의 높이를 조절 가능 
    1. 지정된 위치의 행의 높이를 요청
    2. 지정된 섹션의 헤더의 높이를 요청
    3. 지정된 섹션의 푸터의 높이를 요청
    4. 차원에 대한 기본값..??
    1.  지정된 행의 예상 높이를 요청
    2. 지정된 섹션의 헤더 높이를 요청
    3. 지저된 섹션의 푸터 높이를 요청
  • 행 선택에 대한 응답
    행이 선택 되기전 선택 되고 난후, 선택이 취소 되기전 취소 되고 난후를 알려줍니다.
    1. 멀티 터치를 사용하여 여러 항목을 선택할 수 있는지?
    2. 여러 행을 선택하면 알려줍니다.
    3. 여러 행을 선택한 것을 중지하면 알려줍니다.
    4. 디테일, 악세사리 버튼을 눌렀음을 알립니다.
  • 행 스와이프에 대한 응답
  • 셀 내용 수정
  • 행 구성
    특정 셀을 그릴려고 할 때 알려줍니다.!! willDisplay

 

  • 메뉴
  • 하이라이트
  • 셀의 이동
  • 제거시
  • 포커스 (아이패드 트랙패드 올리면 .. 위에올리면)
  • 포커스 .. 연관?

UITableVIewDataSource

데이터를 받아서 뷰를 그려주는 역할

  • 테이블의 섹션 및 행 수를 설정 가능
     
  • 테이블의 각 행에 대한 셀을 제공
  • 섹션 헤더 및 푸터의 제목을 제공
  • 액션에 따른 반응.
    UITableViewDelegate에서 액션을 설정하면 그 액션 메시지를 받아서 UITableDataSource가 처리함. EditingStyle은 .none, .delete, .insert가 있음.

 

특정 index의 행이 edit 액션이 안뜨게 할 수 있습니다. 메서드를 부르지 않은 경우엔 전부 edit 액션이 뜹니다.

 
  • 이동 관련
    특정 index의 행을 이동시키지 않게 설정할 수 있습니다. 메서드를 부르지 않은 경우엔 전부 move가능
    cell을 특정 index로 이동 시킬 수 있습니다.

 

  • 섹션 인덱스 타이틀
     
     
    테이블 뷰 오른쪽에 1~10 으로 표시했는데 저 인덱스 타이틀을 누르면 테이블 뷰가 이동함.
    타이틀 인덱스를 눌렀을 때 섹션 인덱스에 맞는 위치로 이동합니다. 이 메서드를 사용하지 않아도 섹션 순서에 default로 작동합니다.

Cell Static vs Dynamic

static

→ 스토리보드에서 UI를 다 그리는 경우

(아이폰 설정앱 같은경우 static)

 

일반적인 static Cell은 UIViewController에서는 사용 불가능하고 UITableViewController을 상속 받아야 사용이 가능함. UITableViewController에서 제공하는 함수들로만 static cell을 조정 가능하기 때문.

dynamic

→ DataSource를 통해 데이터를 받아서 cell을 그림

셀의 재사용

셀이 몇천 몇만개가 될경우 메모리가 부족하게 되는데 이를 방지하고자 씀.!

테이블 뷰에 cell이 10개보이면 그 10개의 cell을 가지고 계속 재활용해서 사용!

메모리 관리를 위해서 iOS에서는 Reuse Queue가 돌아가고 있음.

셀이 스크롤 화면 밖으로 나가면 Reuse Queue에 들어가게 되고 dequeueReusableCell()를 사용시 데이터를 받아옵니다. 이 때 Reuse Queue에 원하는 셀이 없으면 init으로 초기화 시킵니다. 원하는 셀이 있으면 prepareForReuse() 메서드를 실행시켜서 재사용을 준비합니다.

dequeueReusableCell(withidentifer:index:) ← UITableView에 있는 메서드

재사용시 주의사항

투명도, 컬러 등 설정들은 재사용시 그대로 유지하고 있기 때문에 cell을 만들 때 세부적으로 코드를 작성해야함.

section 0에만 파랑색으로 배경색을 설정.

스크롤 했을시 파랑색으로 설정한 값들이 재사용됨.

 

Batch Update

tableView.reloadData()는 테이블 뷰 전체를 처음부터 구성하기 때문에 비용이 큽니다. 그래서 테이블뷰의 일부분만 변경되었을 때 테이블 변화적용시킬 수 있는 방법들이 있습니다.

 

데이터에 변화를 주지 않고 View에서만 변화를 시켜주기 때문에 Data를 변경시키고 실행시켜주는 것이 좋습니다.

tableView에서 변경을 많이 했을 경우 delegate와 dataSource에 불필요한 쿼리가 많이 발생하게 됩니다. 이때

beginUpdates() - 여러 수정 메서드들 - endUpdates() 를 할 경우 한번만 쿼리가 가게 됩니다.

beginUpdates, endUpdates는 iOS 2.0에서 나왔음!! performBatchUpdtes는 iOS 11.0에서 나왔음!

performBatchUpdtes를 쓰는것을 애플은 권장합니다..

performBatchUpdtes는 클로저안에서 여러 수정 메서드들을 사용하고 completion 콜백함수로 finished가 제대로 됬는지 확인을 해줍니다.!

'iOS' 카테고리의 다른 글

[iOS] - UserDefaults  (0) 2021.10.03
[iOS] Result Enum  (0) 2021.10.02
[iOS] UIView 도큐먼트읽기  (0) 2021.07.16
[iOS] UIScrollViewDelegate  (0) 2021.06.30
[iOS] UserNotifications  (2) 2021.06.23