테이블 뷰에서 section의 header, footer를 관리하고 셀을 삭제하거나 위치를 바꾸고 그 외의 다른 작업을 수행하기 위한 메서드를 제공한다.
이 프로젝트에서는 많은 Delegate 메소드 중에서 3가지를 써볼 것이다. (2개는 헤더뷰 관련)
UITableViewDelegate는 프로토콜이다!!
즉 테이블뷰가 해야하는 일을 UITableViewDelegate에게 위임해서 위에 정의한 기능들을 수행하는 것이다!
public lazy var friendTableView = UITableView(frame: .zero, style: .grouped).then {
$0.backgroundColor = .clear
$0.translatesAutoresizingMaskIntoConstraints = false
$0.separatorStyle = .none
$0.delegate = self //-> 바로 이 코드로 위임을 하는거겠죠???
$0.dataSource = self //-> 이것도 똑같이 위임 (여기서 코드 보시고 아래서 설명할게용!)
}
UITableDelegate는 의무적으로 선언해야 되는 메소드가 없습니다. (DataSource는 아님)
많은 메소드가 있는데 그 중 한가지를 사용해 볼 생각입니다!
heightForRowAt : 셀 하나의 높이를 지정해주는 함수
아래 코드를 통해서 한 셀의 높이가 50이라는 것을 지정해줄 수 있겠죠?
//MARK: - UITablViewDelegate
extension FriendView: UITableViewDelegate {
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 50
}
테이블 뷰는 데이터를 보여주기만 하는 것이지 자체적으로 데이터를 관리할 수 없기 때문에
UITableViewDataSource 프로토콜을 사용해야 한다.
테이블에서 데이터와 관련된 요청이 오면 응답하며 테이블의 데이터를 직접 관리하거나 앱의 다른 부분과 조정하여 해당 데이터를 관리한다.
UITableViewDataSourece도 프로토콜이다!
즉 delegate처럼 선언해주면 된다.
UITableViewDataSource에서는 의무적으로 선언해줘야 되는 메소드 2개가 있는데 바로
- 몇 개의 셀인지? => numberOfRowsInSection
- 셀이 어떻게 생겼지? -> cellForRowAt
이렇게 2가지이다! 여기서도 이 두가지를 구현해보겠다!
몇개의 셀인지 지정해주는 함수
우리는 더미데이터에 쌓여있는 사용자의 개수만큼을 사용할 예정이기 때문에 더미데이터의 개수를 리턴한다!
extension FriendView: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return friendDummyModel.count
}
어떤 데이터를 보여주는 셀인지 지정하는 함수! 중요하기 때문에 하나씩 뜯어보겠습니다.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let friendCell = tableView.dequeueReusableCell(
withIdentifier: FriendTableViewCell.identifier,
for: indexPath)
as? FriendTableViewCell else { return UITableViewCell() }
friendCell.dataBind(model: friendDummyModel[indexPath.row])
return friendCell
}
재사용 큐에서 필요한 cell을 dequeue 하기 위한 함수
- widthIdentifier: 식별자로 재사용 큐 안의 셀들을 구분하기 때문에 식별자가 들어감!
- for: indexPath: tableView의 행을 식별하기 위해 사용한다!
indexPath.row(행) 과 indexPath.section(섹션)으로 구분된다!!!
dataBind를 통해서 각 셀별로(indexPath.row) 순서에 맞는 값을 넣어준다.