Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

<3주차> TableView를 동작 방식과 화면에 Cell을 출력하기 위해 최소한 구현해야 하는 DataSource 메서드를 설명하시오. #17

Closed
namsoo5 opened this issue Nov 13, 2020 · 7 comments

Comments

@namsoo5
Copy link
Collaborator

namsoo5 commented Nov 13, 2020

No description provided.

@5anniversary
Copy link
Collaborator

  • func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int // cell의 갯수
  • func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell // 셀을 정의
  • func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat  // 셀의 높이를 정의
    

@khyunjiee
Copy link
Member

TableView 동작 방식

처음 cell이 만들어질 때 awakeFromNib가 호출됩니다.
awakeFromNib()로 셀을 만들어준 후 tableView(_:willDisplay:forRowAt:)이 만들어지는 셀마다 실행됩니다.

화면에 display되는 셀까지 만들어진 후에 tableView(_:prefetchRowsAt:indexPath:)가 호출됩니다.
prefetch 화면이 display되는 셀 이후의 10개의 셀들을 미리 호출하는 작업을 합니다.

그 다음 테이블뷰를 스크롤했을 때의 작동입니다.
스크롤 하면서 보여지느 셀에 cellForRowAt, willDisplay가 발생하고 prefetchRowsAt이 작동하면서 prefetch queue에 있는 셀들을 조회합니다.
그 후에 tableView(_:didEndDisplaying:forRowAt:)가 호출되면서 display되던 셀이 사라집니다.

그 후로 작동하다보면 셀이 만들어질 때 awakeFromNib()가 아닌 prepareForReuse()가 호출되는 것을 확인할 수 있습니다. 셀이 빠른 시기에 재사용된다면 dequeueReuableCell 함수가 리턴되기 전에 호출됩니다.


DataSource Method

  • tableView(_:numberOfRowsInSection) -> Int : 섹션별 cell 개수를 리턴합니다.
  • tableView(_:cellForRowAt:) -> UITableViewCell : 반환할 TableViewCell을 정의합니다.

@iJoom
Copy link
Collaborator

iJoom commented Nov 20, 2020

  1. 뷰 컨트롤러는 테이블 뷰의 데이터 소스와 델리게이트를 설정하고 reloadData 메시지를 보냅니다. 데이터 소스는 UITableViewDataSource 프로토콜을 채택해야하며 Delegate는 UITableViewDelegate 프로토콜을 채택해야합니다.

  2. 데이터 소스는 UITableView 개체로부터 numberOfRowsInSection: 메시지를 수신하고 테이블보기의 섹션 수를 반환합니다. 이는 선택적 프로토콜 방법이지만 테이블보기에 둘 이상의 섹션이있는 경우 데이터 소스에서이를 구현해야합니다.

  3. 각 섹션에 대해 데이터 소스는 tableView : numberOfRowsInSection : 메시지를 수신하고 섹션의 행 수를 반환하여 응답합니다.

  4. 데이터 소스는 테이블 뷰에 표시되는 각 행에 대해 tableView : cellForRowAt : 메시지를 수신합니다.
    각 행에 대해 UITableViewCell 개체를 구성하고 반환하여 응답합니다. UITableView 개체는이 셀을 사용하여 행을 그립니다.


Method

  1. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
  2. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

@iJoom iJoom added the 인준 label Nov 20, 2020
@Juhyeoklee
Copy link
Collaborator

TableView의 동작 방식

TableView는 프로토타입 셀을 통해 셀들을 구성하게 됩니다. 프로토타입 셀이란 개발자가 임의로 지정하여 테이블뷰 안에서 사용할 셀들의 예시라고 생각하시면 됩니다. 따라서 테이블 뷰를 구현하기 위해서는 어떠한 셀들을 사용하고 어떻게 배치 할 것인지 구현해주어야 합니다. 이러한 구현을 하기위해서는 DataSource와 Delegate를 채택하여 구현한 객체에게 TableView가 이러한 권한을 위임해주어야 합니다.

DataSource Method

  • func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
  • func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

@namsoo5
Copy link
Collaborator Author

namsoo5 commented Nov 20, 2020

TableView를 동작 방식
awakeFromNib
cellForRowAt
WillDisplay
순으로 실행

nib을 생성하고(Cell 생성)
Tableview가
각 섹션에 필요한 로우의 갯수를 datasource에게 요청
datasource가
필요한 갯수의 정보만큼
주어진 속성을 적용하고 Cell을 전달

화면에 Cell을 출력하기 위해 최소한 구현해야 하는 DataSource 메서드
* numberOfRowsInSection
* cellForRowAt

@namsoo5 namsoo5 added the 남수 label Nov 20, 2020
@choidam
Copy link
Member

choidam commented Nov 20, 2020

TableView

  • 테이블뷰를 사용하기위해서는 Data Source and Delegate를 반드시 구현해야 합니다.

DataSource

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell // return a cell ie UITableViewCell 
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int // return a number ie an Int 
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? // return the title ie a String
  • data source는 앱의 model과 table view의 중간자 역할을 합니다.
  • 데이터를 받아 뷰를 그려주는 역할을 합니다.

Delegate

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) 
func tableView(tableView: UITableView, willBeginEditingRowAtIndexPath indexPath: IndexPath) 
func tableView(tableView: UITableView, willBeginEditingRowAtIndexPath indexPath: IndexPath)
  • Delegate는 테이블뷰의 동작과 출현(appearance)을 담당합니다. view가 변경되는 사항을 델리게이트가 담당하고, 뷰는 그 델리게이트에 의존하여 뷰를 업데이트합니다.

@choidam choidam added the label Nov 20, 2020
@elesahich
Copy link
Collaborator

TableView Delegate, DataSources

해당 테이블뷰를 커스텀 셀, 다이나믹 셀로 정상적으로 그리기 위해서는 최소 2개의 메소드를 참조해야 합니다.
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

인자값과 리턴값에서 알수있듯 섹션별 row의 갯수, indexPath별 UITableViewCell을 명시해주어야 합니다.

StaticCell의 경우 리턴해주지 않아도 됩니다. (TableViewController의 경우임)

@elesahich elesahich added the 승호 승호 label Nov 20, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment