To do check button
todolist를 만들던 도중, 투두 완료 여부를 체크하기 위한 부분이 필요했다.
기본적으로 내장된 CheckMark를 사용할 지 커스텀해서 만들지 고민했는데
커스텀하는게 더 이쁜것 같아서 하트로 만들어봤다.
- button tag
- delegate
- 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를 사용하는 것 같은데.. 이틀 내내 비가 와서 그런가 몸살이 나서 뭘 제대로 못했다.
주말이나 다음주에 바꾸는 걸로~
그리고 다시 보니 체크마크가 깔끔하고 아이폰스러운(?)데 또 고민이 된다..
'iOS > Swift' 카테고리의 다른 글
[Swift] UIStackView 사용, UILabel.font 속성 연속 사용, @objc 어노테이션 (0) | 2023.12.27 |
---|---|
[Swift] tableview가 변경되었을 때 처리하는 방법, beginUpdates() endUpdates() (1) | 2023.12.19 |
[Swift] UITableView, reloadData(), deleteData() / Swipe Delete (0) | 2023.12.14 |
[Swift] iOS AutoLayout (0) | 2023.12.12 |
[Swift] 프로토콜, 확장 (0) | 2023.12.11 |