본문 바로가기
iOS

[iOS] UIButton 액션 코드로 추가하기

by be_beee 2020. 7. 13.

이전 포스팅에서 공통 셀을 구성한 모습을 사진으로 보여준 적이 있는데 이 셀의 구성을 보면 버튼이 두 개 있음을 알 수 있다.

 

다시 등장한 공통 셀 구성 사진.

사용자가 찜해놓은 도서임을 표시하는 하트 버튼과 출간시 알림을 받고싶을 때 선택하는 벨 버튼이 바로 그것인데

이 버튼들은 모두 테이블 뷰의 셀 내에 각각 존재한다.

 

각 버튼의 상태와 그에 따른 작동 원리를 정리해보자면

  1. 버튼이 비어있는 하트일 때 터치하면 채워진 하트로 바뀌고 사용자의 찜리스트에 도서 정보가 추가된다.
  2. 버튼이 채워진 하트일 때 터치하면 비어있는 하트로 바뀌고 사용자의 찜리스트에서 도서 정보가 삭제되어야 한다.

처음에는 단순히 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