반갑습니당 집주인 Kyxxn 박효준입니다 !
지난 편에 이어서 이번에는 드래그 앤 드랍 시 카테고리가 변경되어도 일관성을 유지해보려는데요,
문제 상황부터 자세히 봐보시죠 〰️
문제 상황
지난 편에서 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 써봐야 알아서 더 살펴봐야함..
'iOS' 카테고리의 다른 글
DIContainer 사용 시 Actor Isolation 문제 해결하기 (0) | 2024.12.05 |
---|---|
로컬 DB 결정 논의 (CoreData ~ FileManager) (1) | 2024.12.03 |
우리팀에 적용할 iOS Local DataBase 기술스택 비교 분석 및 결정 (2) | 2024.11.16 |
프로젝트 기술 스택 결정: UIKit vs SwiftUI (2) | 2024.11.14 |