📱 iOS

드래그 앤 드랍 시 카테고리가 변경되어도 일관성 유지하기

kyxxn 2024. 12. 2. 19:55

문제 상황

지난 편에서 CollectionView Drag Drop 델리게이트를 통해서 드래그 앤 드랍을 구현했었다.

근데 우리는 책 커버를 한 번에 모아볼 수 있는 “전체”도 있고, 특정 카테고리에 대한 책 커버만 보여줄 수도 있다.

이것에 대한 일관성 처리를 어떻게 할 지 알아보자.


문제 해결

시나리오

가족, 친구 두 카테고리와 책들이 다음과 같이 있다고 가정해보겠다.

 

이 상황에서 “가족” 카테고리에서 책1을 책3으로 옮겼다고 하자.

나는 그러면 “전체”에서 볼 때도 책1은 책3 뒤에 있어야 한다고 생각한다.

위처럼 말이다.

 

또한, 반대로 “전체”에서 책1을 책3으로 옮겨도,

“가족” 카테고리에서 보면 책1은 책3 뒤에 있어야 한다고 생각한다.

 

나는 위 두 상황에 대한 일관성을 유지해주기 위해서 BookCover 모델들에게 order라는 프로퍼티를 추가했다.

위 사진에서 빨간색 숫자가 order 값이다..!

 

HomeViewModel 처리

HomeViewModel에는 아래의 프로퍼티가 있다.

private(set) var bookCovers = [BookCover]()

private(set) var currentBookCovers = [BookCover]()

currentBookCovers는 현재 화면을 그리기 위해 필요한 프로퍼티이다.

private func dragAndDropBookCover(from currentIndex: Int, to destinationIndex: Int) {
    let currentBookCover = currentBookCovers[currentIndex]
    let targetBookCover = currentBookCovers[destinationIndex]
    bookCovers.remove(at: currentBookCover.order)
    bookCovers.insert(currentBookCover, at: targetBookCover.order)
    currentBookCovers.remove(at: currentBookCover.order)
    currentBookCovers.insert(currentBookCover, at: targetBookCover.order)
}

뷰모델이 input을 받으면 위 메소드로 인해 위의 두 개의 프로퍼티가 갱신된다.

그런데, 다음과 같이 인덱스 에러가 발생했음..!

 

전체 카테고리에서 드래그 앤 드랍이 발생하면 아무 문제가 없는데,

특정 카테고리에서는 인덱스 접근 문제가 생김..

 

 

열심히 끄적끄적..

 

private func dragAndDropBookCover(from currentIndex: Int, to destinationIndex: Int) {
    let currentBookCover = currentBookCovers[currentIndex]
    let targetBookCover = currentBookCovers[destinationIndex]
    bookCovers.remove(at: currentBookCover.order)
    bookCovers.insert(currentBookCover, at: targetBookCover.order)
    currentBookCovers.remove(at: currentIndex)
    currentBookCovers.insert(currentBookCover, at: destinationIndex)
    output.send(.dragAndDropFinished)
}

 

현재 카테고리를 나타내는 currentBookCovers에서는 컬렉션 뷰의 인덱스,

즉 파라미터로 넘어온 것들로만 삽입 삭제를 하면 되고

전체 bookCovers에서는 order로 연산을 해주면 일관성을 유지할 수 있었다 !!!

 

근데 코어데이터까지 이거 되는지는 NSSortDescriptor 써봐야 알아서 더 살펴봐야함..