ToDoList 앱 만들기 (4)

2024.03.19 - [◽️ Programming/T I L] - ToDoList 앱 만들기 (1)

2024.03.21 - [◽️ Programming/T I L] - ToDoList 앱 만들기 (2)

2024.03.25 - [◽️ Programming/T I L] - ToDoList 앱 만들기 (3)

ToDoList 앱 만들기 (4)

오늘은 지금까지 해결하지 못하던 문제들을 한번에 해결하는 날이었다.

분명히 구현이 되어야 하는 기능인데 왜 되지 않을까 고민에 빠졌었지만 한가지 실마리가 해결되니 줄줄이 해결 되는 날이었달까..

오늘은 내가 해결한 내용을 위주로 글을 써볼까 한다.


내가 가지고 있던 문제

새로운 할 일을 추가하면 새로 등록되는 newTodo 의 레이블 값 즉 할일을 적는 부분이 완료 버튼을 누르지 않았는데도 등록되자마자 취소선이 달려 나오거나, 셀이 재사용되면서 기존의 설정되었던 취소선이 다른 셀로 이동하는 등 그 값이 제대로 저장되지 않는 문제를 가지고 있었다.

버튼 값 isSelected 에 대한 오해

먼저 주어진 예제, 다른분들의 하는 작동 방식은 스위치를 토글하였을 때 변하는 isOn의 Bool 값을 토대로 if 문을 사용하여 조건을 주는 방식으로 이뤄졌고 나는 완료 스위치가 아닌 완료 시 버튼을 클릭해 체크박스가 체크되면서 취소선이 그어지는 방식을 원해 그렇게 구현을 하였다.

이 와중에 나는 스위치의 isOn 과 버튼의 isSelected 의 행동이 동일하다고 착각하여 문제를 헤매고 있었다.

버튼의 isSelected 값은 눌려졌을 때 별도의 값을 가질 수 있도록 따로 함수를 설정해야 내가 원하는 클릭할때 마다 Bool 값이 변경될 수 있었다.

@objc func didTapButton(sender: UIButton) {
    sender.isSelected = !sender.isSelected
    delegate?.didTapButton(self, isSelected: sender.isSelected)
    
}

그래서 이렇게 sender.isSelected 값에 반대 값을 받도록 코드를 넣어주고 print 로 찍어보니 버튼을 클릭할 때 마다 내가 원하는 Bool 값을 가질 수 있었다 (누를 때 마다 true , false 값으로 변경)

이 문제가 해결되니 버튼을 눌렀을 때 정상적으로 취소선이 그어졌고 버튼을 다시 눌렀을 때 취소선이 해제 될 수 있었다.

그 이후 이전 값들이 새로운 셀이 추가되어도 변경되지 않고 본인의 값을 잘 가진 상태가 되었다.

새로운 셀이 추가될 때마다 취소선이 그어져 나왔던 현상

cell.cellLabel.attributedText = nil
cell.cellLabel.text = todo.title
cell.checkButton.isSelected = todo.isCompleted
        
// MARK: - 버튼의 선택 여부에 따라 취소선 설정 또는 제거
if cell.checkButton.isSelected {
    let attributedText = todo.title.strikeThrough()
    cell.cellLabel.attributedText = attributedText
} else {
    cell.cellLabel.attributedText = NSAttributedString(string: todo.title)
}

cell.selectionStyle = .none
cell.delegate = self
return cell

이와 같이 새로운 셀이 추가 됐을 때 재사용 될 셀의 값을 넣어준 상태였는데 아마 셀이 재사용되면서 이전 셀의 취소선 넣어진 값이 남아져 있어 새로운 셀에도 적용되어 나타난 문제인 것 같았다.

그렇다면 새로운 셀이 추가될때 마다 cellLabel.attributedText (취소선을 넣기위해 지정했던 변수) 의 값을 nil 로 비워버린다면 새로 생기는 cell 에는 취소선이 그어지지 않지 않을까 하는 마음에

cell.cellLabel.attributedText = nil

이 코드 한 줄을 넣어주니 정말 귀신 같이 모든 문제가 해결되었다.

처음 새로운 셀이 추가될 땐 완료 버튼이 눌러지기 전인 상태이기 때문에 취소선이 아예 없어지도록 설정하면 완료 버튼을 눌러 취소선을 다시 내가 그을 수 있도록 된 것 같다.

오늘 문제가 해결되면서 느낀 건 내가 정확하게 알지 못하는 메서드를 짐작하여 이렇게 작동할 것이다 라고 속단하고 단정지으면 큰 함정에 빠진다는 것이었다.

안쓰던 방식의 코드를 사용할 땐 충분히 이 행동이 어떤 방식으로 이뤄지고 구현되는지 알고 써야겠다고 생각했다.

탭바 컨트롤러 추가 앞으로 구현해야 할 내용

원하는 내용까지 구현이 완료되어 탭바 컨트롤러를 사용해 캘린더를 넣는 과정까지 진행 해볼까 한다.

오늘은 일단 스토리 보드를 활용해 탭바 컨트롤러를 넣어주었다.

내일 캘린더 탭에 캘린더를 넣어보는 과정을 해보려고 한다.