[UITableView] Delegate를 사용하지 않고 테이블 뷰 cell index값을 가져오는 방법

2022. 1. 2. 16:02UIKit, H.I.G

728x90

원래 iOS 개발에서, 어떤 특정한 값을 가져오거나 전달하기 위해 가장 많이 사용하는 방법은 delegate 패턴을 활용하는 방법이다.

하지만, 오늘 다룰 내용은 테이블 뷰에서 delegate 패턴을 사용하지 않고도, 클릭한 cell의 index값을 가져오는 방법을 다뤄보려고 한다.

우선, cell은 이렇게 생겼다.
cell에 있는 여러 element 중에서 오늘은 가장 왼쪽에 있는 pinButton을 클릭했을 때를 가정하고 내용을 다뤄보도록 하겠다.


UITableViewDataSource
에 있는 셀을 통해 먼저 접근해주자.

Cell에 있는 버튼에 타깃 함수(addTarget)를 추가해 버튼이 클릭되었을 때, 액션을 인식할 수 있도록 먼저 추가해줄 것이다.

 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let serviceCell = tableView.dequeueReusableCell(withIdentifier: Const.Xib.cardListTableViewCell, for: indexPath) as? CardListTableViewCell else { return UITableViewCell() }
    serviceCell.pinButton.addTarget(self, action: #selector(pinButtonClicked(_:)), for: .touchUpInside)
    return serviceCell
}

 

그럼 이제 Delegate를 사용하는 것이 아니라, 타깃과 연결된 액션 함수에서 cell index를 사용할 수 있어야 한다는 뜻이기도 하다.


타깃과 연결된 액션 함수를 확인해보자.

코드를 확인해보면, 이전처럼 따로 어떤 테이블 뷰의 delegate 메서드를 사용한 것이 아니라 sender.superView로 접근을 해서 cell의 index를 가져오는 방식을 사용했다.

즉, delegate를 사용하지 않고도 sender를 사용하면, 해당 sender의 index값을 불러올 수 있었다.

@objc func pinButtonClicked(_ sender: UIButton) {
    let contentView = sender.superview
    guard let cell = contentView?.superview as? UITableViewCell else { return }
    let index = cardListTableView.indexPath(for: cell)
    print(index)
}

 

오늘은 여기까지✌🏻

728x90