문제 상황
지난 편에서 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' 카테고리의 다른 글
[iOS] 메인 스레드에서 UI를 업데이트 해야하는 이유 (0) | 2025.01.22 |
---|---|
[iOS] Dynamic Framework로 모듈화 진행하기 (1) | 2024.10.15 |
[CocoaPods] Xcode16.0에서 pod install 안되는 이슈 해결 (0) | 2024.10.08 |