[iOS]TableViewCell안에 있는 버튼 action을 delegate를 이용하여 viewController에서 설정하기

신용철·2020년 9월 29일
0

iOS_TableView

목록 보기
3/6

cell 내부에 버튼을 구현하는 경우, 버튼의 touch이벤트를 viewController로 delegate를 이용하여 구현하는 것이 좋습니다. 이유는 대부분의 data와 event처리 기능이 viewController에 구현되어있고, 기능구현은 view보다는 controller에 모아두는 편이 유지보수에도 좋기 때문입니다. 아래 예시는 headerView에 버튼을 구현하여 가격 혹은 거래량에 따라 tableView를 재정렬 시키는 기능을 구현합니다.

  • 우선 protocol을 선언하고 cell내부에 해당 protocol을 타입으로 하는 delegate 프로퍼티를 선언합니다.
  • protocol을 선언할 때는 반드시 AnyObject로 타입제한을 해두시는 것을 잊지 마시기 바랍니다. cell 내부에 선언한 delegate 프로퍼티에 viewController를 의존성 주입할 것이 기 때문입니다. 자세한 내용은 제 블로그의 protocol편을 참고하시기 바랍니다.
  • cell의 delegate프로퍼티에 viewController를 의존성 주입하기 위해 viewController에서 cell에 접근이 가능한 메서드를 찾습니다. 이 경우에는 headerView를 생성하는 UITableViewDelegate 메서드를 사용합니다.
  • viewController에서 선언한 protocol을 채택하는 것을 잊지 마시기 바랍니다. 해당 protocol을 채택해야 cell 내부의 delegate 프로퍼티에 self로 할당할 수 있습니다.
protocol HeaderViewDelegate: AnyObject// class로 타입 제한 {
    func didSelectedPriceButton()
    func didSelectedVolumeButton()
}

class CommonTableHeaderView: UITableViewHeaderFooterView {

    var delegate: HeaderViewDelegate? // 의존성 주입할 프로퍼티 선언

    let priceButton = UIButton()
    let volumButton = UIButton()
    
@objc func didSelectedPriceButton(_ sender: UIButton) {
        delegate?.didSelectedPriceButton()
    }
    
@objc func didSelectedVolumeButton(_ sender: UIButton) {
        delegate?.didSelectedVolumeButton()
    }
    
 }
 
 class BaseViewController: UIViewController, CommonViewControllerProtocol,
 HeaderViewDelegate//<- 프로토콜 채택 {
 
    func didSelectedPriceButton() {
        self.viewModel?.resultData.sort { $0.price ?? 0 < $1.price ?? 0 }
        self.tableView.reloadData()
       }
    
    func didSelectedVolumeButton() {
        self.viewModel?.resultData.sort { $0.volume ?? 0 < $1.volume ?? 0 }
        self.tableView.reloadData()
       }
 
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) 
    -> UIView? {
        guard let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: 
        "sectionHeader") as? CommonTableHeaderView else {
            return UIView()
        }
        headerView.delegate = self //<-- 의존성 주입
        return headerView
    }
}
  • 이제 버튼의 addTarget 메서드를 이용하여 Touch이벤트를 ViewController에서 구현할 수 있습니다.
profile
iOS developer

0개의 댓글