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