보는 것 처럼 누른 순서대로 deleteItem 버튼을 누르면 저런 오류가 났다.
에러 메시지인 Index out of range는 배열의 인덱스를 잘못 참조했을 때 발생한다고 하는데...
이 문제는 menuList.remove(at: row)에서 row 값이 menuList의 유효한 범위를 벗어난 경우라서 발생한 것 이고
또한 deleteItem 메서드에서 row 값을 설정하는 방식과 테이블 뷰 업데이트의 일관성이 부족하기 때문일 가능성이 있다는 걸 알게 되었다.
tag를 남용하면 안좋다는 내용은 어제 공부해서 알고는 있었다.
하지만 이렇게 바로 문제가 나올 줄은 몰랐다.. 고작 3개라고 생각해서 ㅜ
아무튼 나는 현재 버튼에 tag 값을 사용하여 행(row)의 인덱스를 식별하고 있다.
하지만, 테이블 뷰에서 데이터가 변경될 때 예를들면 아까처럼 품목을 삭제하는 경우에는 tag 값이 테이블 뷰의 실제 인덱스와 맞지 않을 수 있다는 걸 알게 되었고
indexPath를 직접 참조하도록 수정을 했다.
@objc func deleteItem(sender: UIButton) {
// 버튼이 속한 셀의 indexPath를 가져옴
guard let cell = sender.superview?.superview as? MenuTableViewCell,
let indexPath = tableView.indexPath(for: cell) else { return }
let row = indexPath.row
menuList.remove(at: row)
tableView.deleteRows(at: [indexPath], with: .automatic)
updateTableViewHeight()
}
음.. 결과적으로 이 코드를 했을 때 버튼 자체가 눌리지 않았다.
버튼이 눌리지 않았던 이유는 sender.superview?.superview를 사용하여 셀을 찾는 방식에서 발생한 문제일 수 있었고..
UIButton이 포함된 셀의 부모 뷰 계층 구조가 예상과 다를 경우에 superview나 superview?.superview 접근이 잘못될 수 있기 때문이다.
sender는 버튼이다.
UIButton은 MenuTableViewCell의 서브뷰이지만,
버튼이 속한 뷰 계층 구조에서 sender.superview?.superview로 접근하면 정확한 셀을 찾을 수 없을 수 있다.
실제로 버튼은 셀의 컨텐트 뷰에 속해 있기 때문,,,,
해당 코드로 했더니 어떤 순서로 행을 삭제해도 오류가 발생하지 않았다.
다행이다.
머리 빠개지고 뽀개지고 난리 날 것 같다.
많이 부족하다고 느낀 하루다.
오늘은 각자 만든 뷰들을 하나로 합치는 작업을 했는데, 합치는 과정에서 팀원에게 도와달라고 애원했ㄷ다.
(도와주신 마빈님 잊지않을게요)
덕분에 합치기까지 성공했는데 그 내용은 내일 쓰도록 하겠다.
더 더 더 더 공부해야겠다 더이상 모를 때 마다 붙여넣기는 그만 하고 싶다.
나도 멋있게 화면공유하며 코드를 짜는 날이 올까.
왔으면 좋겠다.