[ swift ] 키오스크 과제 tableView 3차

sonny·2024년 11월 28일
2

TIL

목록 보기
55/133

트러블 슈팅

보는 것 처럼 누른 순서대로 deleteItem 버튼을 누르면 저런 오류가 났다.

에러 메시지인 Index out of range는 배열의 인덱스를 잘못 참조했을 때 발생한다고 하는데...

이 문제는 menuList.remove(at: row)에서 row 값이 menuList의 유효한 범위를 벗어난 경우라서 발생한 것 이고

또한 deleteItem 메서드에서 row 값을 설정하는 방식과 테이블 뷰 업데이트의 일관성이 부족하기 때문일 가능성이 있다는 걸 알게 되었다.

1차 해결방법 tag 값 확인

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로 접근하면 정확한 셀을 찾을 수 없을 수 있다.

실제로 버튼은 셀의 컨텐트 뷰에 속해 있기 때문,,,,

2차 해결방법 강제로 테이블 뷰를 다시 로드

해당 코드로 했더니 어떤 순서로 행을 삭제해도 오류가 발생하지 않았다.

다행이다.

음 ...

머리 빠개지고 뽀개지고 난리 날 것 같다.

많이 부족하다고 느낀 하루다.

오늘은 각자 만든 뷰들을 하나로 합치는 작업을 했는데, 합치는 과정에서 팀원에게 도와달라고 애원했ㄷ다.
(도와주신 마빈님 잊지않을게요)

덕분에 합치기까지 성공했는데 그 내용은 내일 쓰도록 하겠다.

더 더 더 더 공부해야겠다 더이상 모를 때 마다 붙여넣기는 그만 하고 싶다.

나도 멋있게 화면공유하며 코드를 짜는 날이 올까.

왔으면 좋겠다.

profile
iOS 좋아. swift 좋아.

0개의 댓글

관련 채용 정보