UICollectionView 에서 Cell 삭제하기

안녕하세요!
콜렉션뷰에서 셀을 삭제하고, 그게 코어데이터에 반영되길 원하는데요.

우선 셀에 삭제 버튼을 만든 뒤 셀 파일에 아웃렛을 연결하고,
뷰컨트롤러에서 삭제버튼의 타겟을 설정 해줬습니다.


func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
//Delete Cell
        cell.deleteProjectButton.addTarget(self, action: #selector(deleteProjectButtonTapped(_:)), for: .touchUpInside)
}

그런 다음 뷰컨트롤러에 삭제버튼의 액션 함수를 만드려고 하는데요,
해당 셀의 indexPath,row 값을 어떻게 얻는지 모르겠습니다ㅠㅠ
indexPathForSelectedItems로 얻으려고 하는데
오류메세지로 No exact matches in Call to subscript가 뜨네요ㅠㅠ


 @IBAction func deleteProjectButtonTapped(_ sender: UIButton) {
        let indexPath = projectListCollectionView.indexPathsForSelectedItems
        let projectToRemove = self.items![indexPath]

        // Remove the project
        self.context.delete(projectToRemove)

        // Save the data
        do{
            try self.context.save()
        } catch {

        }

        // Re-fetch the data
        self.fetchProject()
        
    }

좋아요 1

찾아보니 cell.deleteProjectButton.tag = indexPath.row 으로 태그를 달아준 다음,
그 태그를 호출해서 삭제하니 되었습니다!

좋아요 2

teohwang님, 해결이 되었으니 다행입니다.

하지만 지금 구현하신게 Best Practice에 해당하지는 않기 때문에 좀 더 리서치를 해 보시는 게 필요해 보입니다.

결국 셀을 삭제하는 건 콜렉션뷰를 구성하는 데이터를 삭제한 뒤 콜렉션뷰를 리로드 하는 거라서요, (테이블 뷰도 마찬가지죠?!)

이 경우 delegate를 설정하고 뷰 컨트롤러를 통해 해당 데이터를 삭제하는 방식이 필요해 보입니다.

테이블 뷰 셀의 델리게이트 설정과 삭제는 AppDev 동영상에 있습니다.

안녕하세요!
알려주신 대로 시도를 해보았는데요,

셀의 xib에 삭제 버튼을 추가하고,
셀의 클래스에
var delete = false 라는 변수와
@IBAction func deleteButtonTapped(_ sender: UIButton!) {
delete = true
}
라는 함수를 만들었습니다.

이제 뷰컨트롤러에서 delete가 true일때 삭제하는 코드를 넣으면 될 것 같은데, 이 부분을 어디에 넣어야할까요?
뭔가 행동이 있을때마다 reload되는 부분에 넣어야할 것 같은데,
cellForItem에다가 넣으니 이건 매번 갱신되는 부분이 아니라 그런지 반응이 없네요ㅠㅠ

어떤 액션이 있을 때마다 셀을 reload 하는 델리게이트 함수가 따로 있는걸까요?

좋아요 1

셀은 각자가 스스로 리로드하는 게 아니라
iOS 시스템이 리로드가 필요하다고 판단할 때 리로드 하게 됩니다.
테이블은 수많은 데이터가 표시되는 UI이기 때문에 효율을 최대화하기 위한 설계라서 그래요.

생각해 보실 부분은, MVC 패턴으로 코딩을 한다고 할 때,
지금 작성하고 계신 Cell의 서브클래스는 당연하게도!! View에 해당하는 영역이며
그렇기 때문에 Model과 연관된 작업을 직접 하지 않는 게 좋습니다.
그런 작업은 glue code 라고 불리는 Controller에게 맡기는 거죠.

그래서 ViewController에게 어떤 아이템을 삭제해야 하는지를 알려주는 역할만 하고
실제 삭제와 삭제 이후의 리프레시 작업은 ViewController가 하는 게 맞습니다.

:metal: