이전 포스팅에서 공통 셀을 구성한 모습을 사진으로 보여준 적이 있는데 이 셀의 구성을 보면 버튼이 두 개 있음을 알 수 있다.
사용자가 찜해놓은 도서임을 표시하는 하트 버튼과 출간시 알림을 받고싶을 때 선택하는 벨 버튼이 바로 그것인데
이 버튼들은 모두 테이블 뷰의 셀 내에 각각 존재한다.
각 버튼의 상태와 그에 따른 작동 원리를 정리해보자면
- 버튼이 비어있는 하트일 때 터치하면 채워진 하트로 바뀌고 사용자의 찜리스트에 도서 정보가 추가된다.
- 버튼이 채워진 하트일 때 터치하면 비어있는 하트로 바뀌고 사용자의 찜리스트에서 도서 정보가 삭제되어야 한다.
처음에는 단순히 UITableViewCell 클래스 내에 버튼의 액션 메서드를 추가하여 위의 기능을 구현하려 하였으나 이렇게 할 경우 도서 정보의 index path 값을 불러올 수 없어 문제가 생겼다.
그래서 열심히 구글링한 결과 해당 셀이 포함된 테이블 뷰 델리게이트에서 addTarget을 통해 메서드를 추가해줄 수 있다는 사실을 알았다.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// 중략
cell.heartBtn.tag = indexPath.row
cell.heartBtn.addTarget(self, action: #selector(onOffHeartBtn), for: .touchUpInside)
return cell
}
버튼의 tag 값을 indexPath.row로 정해두면 addTarget에서 추가한 액션 메서드에서 sender를 통해 tag 값에 접근할 수 있다.
@objc func onOffHeartBtn(_ sender: UIButton!) {
if sender.imageView?.image != UIImage(systemName: "heart.fill") {
sender.setImage(UIImage(systemName: "heart.fill"), for: .normal)
heartList.append(newbooksList[sender.tag])
// sender.tag = indexPath.row
} else {
// 중략
}
}
끝!
'iOS' 카테고리의 다른 글
[iOS] URLComponents를 위한 Dictionary extension (0) | 2020.07.14 |
---|---|
[iOS] 코드로 바 버튼 아이템 추가하기 (0) | 2020.07.14 |
[iOS] URL을 통해 이미지 데이터 가져오기 (0) | 2020.07.13 |
#5. Alert (0) | 2020.04.18 |
#4. Delegate Pattern (0) | 2020.04.18 |