iOS/Swift

[Swift] TableViewCell 내부 UIButton Action 처리하기 (tag)

YEN_ 2023. 12. 15. 19:29

 

To do check button

 

todolist를 만들던 도중, 투두 완료 여부를 체크하기 위한 부분이 필요했다.

기본적으로 내장된 CheckMark를 사용할 지 커스텀해서 만들지 고민했는데

커스텀하는게 더 이쁜것 같아서 하트로 만들어봤다.

 

이게 checkmark 이다

 

 

  1. button tag
  2. delegate
  3. closure

이렇게 세가지 방법으로 구현할 수 있는데, 나는 간단히 모양을 보고 싶었던 것이기 때문에 tag를 사용해서 구현해보았다.

데이터 안정성을 고려하면 2번) delegate protocol을 만들어서 처리하는 게 맞는 것 같다.

 

 

button.tag를 사용한 tableviewcell 안에 있는 button action 

 

cell.todoCompleteButton.tag = indexPath.row
cell.todoCompleteButton.addTarget(self, action: #selector(checkBoxButtonTapped(sender:)), for: .touchUpInside)

 

cell 의 버튼이 클릭되면 checkBoxButtonTapped(sender:) 메서드를 호출하도록 만든다

 

@objc func checkBoxButtonTapped(sender: UIButton) {
        guard let cell = sender.superview?.superview as? ToDoListTableViewCell else {
            return
        }
        
        let index = sender.tag
        
        !testData[index].isComplete ? (testData[index].isComplete = true) : (testData[index].isComplete = false)
        cell.isComplete = testData[index].isComplete
    }

 

대입한 indexPath.row (= button.tag) 를 사용해서 선택에 따라 true, fasle를 구분해서 값을 바꿔주었다.

 

var isComplete: Bool = false {
        didSet {
            if isComplete == true {
                todoCompleteButton.tintColor = UIColor.systemRed
            } else {
                todoCompleteButton.tintColor = UIColor.lightGray
            }
        }
    }

 

바꾸는 프로퍼티에 옵저버를 사용해서 하트모양 button의 색을 변경해준다.

 

 

 

문제점

tag 속성은 앱에서 view 객체를 고유하게 식별하기 위한 용도로 사용한다.

만약에 tableview의 section이 2개 이상 존재하면 각 cell의 tag값이 중복되는 문제가 있다.

 

 

 

가장 적합한 것은 delegate를 사용하는 것 같은데.. 이틀 내내 비가 와서 그런가 몸살이 나서 뭘 제대로 못했다.

주말이나 다음주에 바꾸는 걸로~

그리고 다시 보니 체크마크가 깔끔하고 아이폰스러운(?)데 또 고민이 된다..