[swift] Swift IGListKit에서 아이템 이동 처리하기

이번 블로그 포스트에서는 Swift와 IGListKit을 사용하여 아이템 이동 기능을 구현하는 방법에 대해 알아보겠습니다.

IGListKit 소개

IGListKit은 Instagram에서 개발된 iOS 앱에 사용되는 데이터 주도형, 유연한 인터페이스 구현을 위한 라이브러리입니다. IGListKit은 UICollectionView를 확장하며, 데이터를 처리하기 위한 방법을 제공하여 복잡한 데이터 디스플레이와 상호작용을 쉽게 처리할 수 있습니다.

아이템 이동 기능 구현하기

IGListKit을 사용하여 아이템 이동 기능을 구현하려면 다음 단계를 따르세요.

  1. IGListAdapterUpdater를 초기화합니다. 이 객체는 UICollectionView의 업데이트를 처리하는 데 도움을 줍니다.
let adapterUpdater = IGListAdapterUpdater()
  1. 이동 가능한 아이템이 있는 데이터 소스를 생성합니다. 이 데이터 소스는 IGListAdapterDataSource 프로토콜을 구현해야 합니다.
class MyDataSource: NSObject, IGListAdapterDataSource {
    // ... 코드 생략 ...
    // 이동 가능한 아이템을 반환하는 메서드를 구현합니다.
    func listAdapter(_ listAdapter: IGListAdapter, 
                     moveObject  object: Any, 
                     fromPrevious previousObjects: [Any], 
                     toPrevious updatedObjects: [Any]) {
        // 이동할 아이템에 대한 작업을 수행합니다.
        // 예: 데이터 소스 내에서 아이템 위치를 변경하고, 데이터를 업데이트합니다.
    }
    // ... 코드 생략 ...
}
  1. 이동 가능한 아이템의 적절한 제어 UI(예: 드래그 앤 드롭 제스처)를 구현합니다. 아이템을 이동할 때마다 listAdapter(_:moveObject:fromPrevious:toPrevious:) 메서드가 호출됩니다.
class MyViewController: UIViewController {
    // ... 코드 생략 ...
    // IGListCollectionView, IGListAdapter 등을 초기화합니다.
    
    // 아이템 이동을 시작하는 메서드를 구현합니다.
    func startMovingItem(at indexPath: IndexPath) {
        guard let object = dataSource.object(at: indexPath) else {
            return
        }
        // IGListAdapter 업데이터에 이동 가능한 아이템을 추가합니다.
        adapterUpdater.moveObject(object)
    }
    
    // ... 코드 생략 ...
}
  1. 이동 가능한 아이템에 대한 UI 작업을 수행하고, 데이터 소스 내에서 아이템 위치를 변경하고 업데이트하는 listAdapter(_:moveObject:fromPrevious:toPrevious:) 메서드를 구현합니다.
class MyDataSource: NSObject, IGListAdapterDataSource {
    // ... 코드 생략 ...
    func listAdapter(_ listAdapter: IGListAdapter, 
                     moveObject  object: Any, 
                     fromPrevious previousObjects: [Any], 
                     toPrevious updatedObjects: [Any]) {
        // 이동할 아이템에 대한 작업을 수행합니다.
        if let previousIndex = previousObjects.firstIndex(where: { $0 === object }),
           let updatedIndex = updatedObjects.firstIndex(where: { $0 === object }) {
            // 이동할 아이템의 이전 위치와 업데이트된 위치를 사용하여 작업을 수행합니다.
            // 예: 데이터 소스 내에서 아이템 위치 변경 및 업데이트
            dataSource.moveItem(from: previousIndex, to: updatedIndex)
            collectionView.reloadData()
        }
    }
    // ... 코드 생략 ...
}

정리

이번에는 Swift와 IGListKit을 사용하여 아이템 이동 기능을 구현하는 방법에 대해 알아보았습니다. IGListKit은 데이터 주도형 인터페이스 구현에 효과적인 라이브러리이며, 아이템 이동과 같은 상호작용을 쉽게 처리할 수 있도록 해줍니다.

더 많은 IGListKit의 기능과 사용 방법에 대해서는 공식 IGListKit GitHub 저장소를 참조해주세요.