TableViewLifeCycle Code Review


이번에도 코드를 읽어가며 공부를 해봅시다!!

전체 코드는 맨아래 있으니 참고하세요 !!


이번에는 코드를 통해 테이블 뷰의 라이프 사이클을 알아보자

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "CellId", for: indexPath)
    cell.textLabel!.text = "Cell \(indexPath.row)"
    print("cellForRowAt : \(indexPath.row)") // 셀을 새로 생성할때마다 계속 찍히는 출력문
    return cell
  }

위의 메소드는 UITableViewDataSource 프로토콜의 메소드 이다

tableView 메소드는 셀이 테이블 뷰의 특정 위치에 삽입 되도록 데이터 소스에 요청 하는 메소드 이다

위 메소드의 파라미터는 2개가 있는데 tableView,indexPath 이다

먼저 tableView 파라미터는 셀을 요청하는 테이블 뷰를 받는다

그 다음 indexPath 파라미터는 테이블 뷰에서 row(행)을 찾는 index 경로를 받는다

리턴으로는 테이블 뷰가 지정된 행에 사용할 수 있는 UITableViewCell에서 상속되는 객체를 리턴한다

이 메소드 안에 있는 let cell을 뜯어보자 이 cell 상수는 위의 코드에서 보이듯이

tableView 메소드의 리턴값이 된다 즉, 이 cell 상수는 UITableViewCell 에서 상속되는 객체이다

그리고 이 cell 을 뜯어보면 다음과 같다

let cell = tableView.dequeueReusableCell(withIdentifier: "CellId", for: indexPath)

이 코드를 한번 읽어보면

이 cell 상수는 dequeueReusableCell 메소드의 반환값을 받는다

다시말해 tableView 메소드의 리턴값은 dequeueReusableCell 메소드인 cell 인 것이다

이 dequeueReusableCell 메소드는 지정된 재사용 식별자 (identifier)에 대한 재사용 가능한 테이블 뷰의 셀 객채를 반환하고 테이블 뷰에 추가 하는 기능을 하며

cell 상수는 dequeueReusableCell 메소드의 리턴 값인 identifier 가 같은 UITableViewCell 객체, 유효한 셀을 받는 것이다를 받는 것이다

그래서

print("cellForRowAt : \(indexPath.row)")

코드를 넣어 시뮬레이터를 실행시켜 셀을 위 아래로 움직이는 액션을 주면 테이블 뷰에서 새로 생성되는 IndexPath 의 row 값을 출력해서 볼 수 있다

참고 : struct IndexPath는 중첩 배열 트리의 특정 위치에 대한 경로를 함께 나타내는 인덱스 목록이다

extension TableViewLifeCycle: UITableViewDelegate {
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        print("Will Display Cell : \(indexPath.row)")
    }
    func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        print("Did End Display Cell : \(indexPath.row)"

이번에는 UITableViewDelegate 프로토콜 내에 구현된 메소드들을 살펴보자

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        print("Will Display Cell : \(indexPath.row)")
    }

이 메소드는 테이블 뷰가 특정 행에 대해 셀을 새로 만들어 내려고 한다는 것을 delegate에게 알려준다 이러한 역활을 한다 그러므로 이 메소드는 내에

 print("Will Display Cell : \(indexPath.row)")

이 출력문 코드는 새로 셀이 만들어 내려고 할 때 IndexPath의 row 값을 출력해서 볼 수 있다

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        print("Did End Display Cell : \(indexPath.row)")

이 메소드는 지정된 셀이 테이블에서 제거되엇다는 것을 delegate에게 알려주는 역활을 한다

즉, 지정된 셀이 테이블에서 제거되는 시점에 대한 것 그래서 그때에 행동할 코드를 넣어 주면 되는데

 print("Did End Display Cell : \(indexPath.row)")

위의 출력문을 이용하여 제거가 되는 셀의 row 값을 출력한다


Code

import UIKit

final class TableViewLifeCycle: UIViewController {
  
  override var description: String {
    return "TableView - LifeCycle"
  }
  let data = Array(1...40)
  
  override func viewDidLoad() {
    super.viewDidLoad()
    let tableView = UITableView(frame: view.frame)
    tableView.dataSource = self
    tableView.delegate = self
    tableView.register(MyTableViewCell.self, forCellReuseIdentifier: "CellId")
    view.addSubview(tableView)
  }
}

extension TableViewLifeCycle: UITableViewDataSource {
  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return data.count
  }
  
  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "CellId", for: indexPath)
    cell.textLabel!.text = "Cell \(indexPath.row)"
    print("cellForRowAt : \(indexPath.row)") 
    return cell
  }
}
extension TableViewLifeCycle: UITableViewDelegate {
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        print("Will Display Cell : \(indexPath.row)")
    }
    func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        print("Did End Display Cell : \(indexPath.row)") 
    }
}