-
Delegate 패턴을 이용하여 TableViewCell 내부의 버튼 이벤트 처리하기iOS/Swift 2022. 1. 13. 02:19
안녕하세요!! 이번엔 Delegate 패턴을 이용해서 TableViewCell의 버튼 이벤트를 처리하는 방법을 정리했습니다.
이번 글도 노션에서 옮겨와 말이 짧습니다!! 양해해주세용😽
Delegate 패턴이란?
Delegate는 한국어로 대리자, 위임자.... 라는 의미를 가지고 있다.
그렇다면 어떤 일을 대리하고, 위임하는 것일까??
객체지향 프로그래밍에서 Delegate라는 것은 어떤 객체가 해야 하는 일을 부분적으로 대신 처리를 하는 것을 말한다.
예시
그림 출처: https://terry-some.tistory.com/111 UITableView의 셀을 눌렀을 때 호출하는 기능은 TableViewDelegate에서 처리를 할 수 있지만, 셀 내부의 특정 버튼에 대한 이벤트를 처리할 수 없다.
이런 경우에는 커스텀 Delegate를 만들어서 처리해야한다.
위와 같은 TableView Cell이 있다. 바로 위쪽에서 설명했듯이 셀을 클릭했을 때의 이벤트는 TableViewDelegate의 메소드를 이용해서 처리할 수 있지만, 오른쪽 상단에 있는 클립모양 버튼을 눌렀을 때의 이벤트는 따로 처리를 해주어야 한다. 이때 필요한 것이 커스텀 Delegate다.
protocol LinkButtonDelegate: AnyObject { func linkButtonClicked(index: Int) }
먼저 버튼을 눌렀을 때 해야할 일을 정의해야한다. 링크 버튼을 눌렀을 때의 이벤트를 처리할 것이므로 이런 함수를 쓸거다~ 라고 프로토콜을 작성해두었다. 함수가 하는 행동은 이 프로토콜을 채택한 객체에서 설정하면 된다. 매개변수로는 index라는 Int값을 받는데, TableView의 indexPath.row에 있는 값을 알기 위해서 설정해두었다.
class MovieTableViewCell: UITableViewCell { //MARK: Property var linkButtonDelegate: LinkButtonDelegate? // 프로토콜 객체 생성 var index: Int = 0 //MARK: Method @IBAction func linkButtonClicked(_ sender: UIButton) { if let delegate = linkButtonDelegate { delegate.linkButtonClicked(index: index) // 위쪽에 선언한 객체가 이벤트를 처리할 수 있도록 한다. } } override func awakeFromNib() { super.awakeFromNib() } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) } }
이후, 만들어둔 Custom Table View Cell로 가서 프로토콜 객체를 생성하고, index 프로퍼티도 생성해준다.
그리고 IBAction을 원하는 버튼에 연결하고 이벤트 처리에 관한 것을 프로토콜 객체가 처리하도록 한다.
cell.linkButtonDelegate = self cell.index = indexPath.row
이제 뷰 컨트롤러에서 위임받으면 된다. tableView의 delegate 메소드인 cellForRow에서 커스텀셀에 생성해둔 프로토콜 객체를 해당 뷰 컨트롤러에 위임하면 된다. 그러면 에러가 발생할텐데,
extension ViewController: LinkButtonDelegate { func linkButtonClicked(index: Int) { print("linkButton Clicked") let sb = UIStoryboard.init(name: "WebLinkViewControllerStoryboard", bundle: nil) let vc = sb.instantiateViewController(withIdentifier: "WebLinkViewController") as! WebLinkViewController var title = movies[index].korTitle if !filteredMovies.isEmpty { title = filteredMovies[index].korTitle } vc.webViewTitleString = title! self.present(vc, animated: true, completion: nil) } }
제대로 프로토콜을 채택해주지 않아서 생기는 오류다. 프로토콜을 채택한 뒤, 함수를 구현해주면 된다! 🤠
그럼 테이블뷰 셀에서 버튼을 눌렀을 때, linkButtonClicked가 실행되는 것을 확인할 수 있다.
'iOS > Swift' 카테고리의 다른 글
Swift Localization 처리하기(로컬라이징, 현지화) (0) 2022.01.14 Swift 위치정보를 받아서 행정구역 단위로 나타내기(역 지오코딩, reverse geocoding) (0) 2022.01.13 UISearchBar에서 사용자가 입력을 멈췄을 때 자동으로 검색하기(실시간 검색) (0) 2022.01.11 특정 모서리에만 CornerRadius 적용하기 (0) 2022.01.11 UITableViewCell 동적 높이 할당(UITableView Dynamic height) (0) 2022.01.11