[swift] IGListKit에서 추가적인 서브셀들 삽입하는 방법

IGListKit은 UICollectionView를 단순화하고 유연성을 높여주는 강력한 프레임워크입니다. IGListKit을 사용하여 UICollectionView의 셀을 관리할 때, 때로는 하나의 셀이 아닌 여러 개의 서브셀을 추가해야 할 때가 있습니다. 이번 블로그 포스트에서는 IGListKit에서 추가적인 서브셀들을 삽입하는 방법에 대해 알아보겠습니다.

IGListKit의 ListAdapter 사용하기

IGListKit에서 서브셀을 추가하기 위해 우선 IGListKit의 ListAdapter를 사용해야 합니다. ListAdapter는 UICollectionView에 데이터를 제공하고 업데이트를 관리하는 역할을 합니다. ListAdapter를 초기화하고 설정하는 코드를 아래와 같이 작성할 수 있습니다.

let adapter = ListAdapter(updater: ListAdapterUpdater(), viewController: self)
adapter.collectionView = collectionView
adapter.dataSource = self

서브셀 데이터 모델 및 셀 등록하기

서브셀을 추가하기 위해서는 각각의 서브셀에 해당하는 데이터 모델을 생성하고, 해당 셀을 UICollectionView에 등록해야 합니다. IGListKit은 다양한 셀 종류를 지원하므로, 각각의 서브셀에 대한 셀 등록이 필요합니다. 예를 들어, “TextCell”, “ImageCell” 등의 여러 개의 서브셀이 있다면 각각의 서브셀에 대해 셀 등록 코드를 작성해야 합니다.

adapter.collectionView?.register(TextCell.self, forCellWithReuseIdentifier: TextCell.identifier)
adapter.collectionView?.register(ImageCell.self, forCellWithReuseIdentifier: ImageCell.identifier)

UICollectionViewDataSource 메서드 수정하기

IGListKit에서 서브셀을 추가하기 위해서는 UICollectionViewDataSource의 메서드를 수정해야 합니다. 직접 UICollectionViewDataSource 메서드를 구현하는 대신 ListAdapterDataSource 프로토콜을 준수하는 확장을 작성하여 IGListKit에게 데이터를 제공합니다. 이때, IGListKit에는 각각의 서브셀과 해당 데이터 모델을 연결하는 방법을 알려주어야 합니다.

extension YourViewController: ListAdapterDataSource {
    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {
        // 각각의 서브셀에 해당하는 데이터 모델들을 반환하는 코드 작성
    }
    
    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {
        // 각각의 서브셀에 해당하는 ListSectionController를 반환하는 코드 작성
    }
    
    func emptyView(for listAdapter: ListAdapter) -> UIView? {
        return nil
    }
}

새로운 서브셀 추가하기

IGListKit에서 새로운 서브셀을 추가하기 위해서는 새로운 데이터 모델과 해당 데이터 모델에 대한 ListSectionController를 작성해야 합니다. 데이터 모델은 ListDiffable 프로토콜을 준수해야 하며, 해당 데이터 모델에 따라서 셀을 구성하는 새로운 ListSectionController를 작성해야 합니다.

class MyNewSubcellDataModel: NSObject, ListDiffable {
    // 새로운 서브셀에 대한 데이터 모델
}

class MyNewSubcellSectionController: ListSectionController {
    private var item: MyNewSubcellDataModel?
    
    override init() {
        super.init()
        self.inset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
    }
    
    override func numberOfItems() -> Int {
        return item != nil ? 1 : 0
    }
    
    override func cellForItem(at index: Int) -> UICollectionViewCell {
        guard let cell = collectionContext?.dequeueReusableCell(of: NewSubcell.self, for: self, at: index) as? NewSubcell else {
            fatalError("Could not dequeue cell")
        }
        // 셀 구성하는 코드 작성
        return cell
    }
    
    override func sizeForItem(at index: Int) -> CGSize {
        guard let context = collectionContext, let item = item else {
            return .zero
        }
        // 셀 크기를 설정하는 코드 작성
        return CGSize(width: context.containerSize.width, height: 50)
    }
    
    override func didUpdate(to object: Any) {
        self.item = object as? MyNewSubcellDataModel
    }
    
    override func didSelectItem(at index: Int) {
        // 셀 선택 시 동작 설정
    }
}

등록된 서브셀에 데이터 추가하기

이제 새로 작성한 서브셀을 등록하고, 해당 서브셀에 데이터를 추가할 수 있습니다.

let newData = MyNewSubcellDataModel()
adapter.performUpdates(animated: true, completion: nil)

위의 코드에서 “newData”는 MyNewSubcellDataModel의 인스턴스입니다. 이렇게 생성한 데이터 객체를 ListAdapter의 performUpdates 메서드를 호출하여 리스트에 반영합니다.

결론

IGListKit을 사용하면 UICollectionView를 간단하게 관리하고 유연성을 높일 수 있습니다. IGListKit에서 서브셀을 추가하는 방법에 대해 알아보았으며, 새로운 서브셀을 추가하는 방법도 배웠습니다. 이러한 기술을 활용하여 IGListKit을 더욱 효율적으로 사용해보세요!

참고 자료