[swift] Swift IGListKit을 사용한 컬렉션 뷰 셀 재사용하기

IGListKit은 iOS 앱에서 컬렉션 뷰를 구성하는 데 도움을 주는 훌륭한 라이브러리입니다. IGListKit을 사용하면 컬렉션 뷰의 셀을 쉽게 재사용할 수 있으며, 데이터를 관리하고 업데이트하는 데도 유용합니다.

IGListKit 시작하기

먼저, IGListKit을 프로젝트에 추가해야 합니다. CocoaPods을 사용한다면, Podfile에 IGListKit을 추가하고 pod install을 실행하세요.

pod 'IGListKit'

프로젝트에서 IGListKit을 사용하기 위해 다음과 같이 모듈을 임포트하세요.

import IGListKit

셀 재사용하기

IGListKit은 컬렉션 뷰의 셀을 재사용하기 위한 몇 가지 기능을 제공합니다.

먼저, IGListCollectionViewDelegateLayout 프로토콜을 준수하는 컬렉션 뷰 레이아웃을 만들어야 합니다. 이 레이아웃은 shouldSetupCell 메서드를 구현해야 합니다. 이 메서드는 새 셀을 생성하기 전에 재사용 가능한 셀이 있는지 확인하기 위해 호출됩니다.

class MyCollectionViewLayout: UICollectionViewFlowLayout, IGListCollectionViewDelegateLayout {
    
    func shouldSetupCell(from view: UIView, to cell: UICollectionViewCell) -> Bool {
        return true // 항상 재사용 가능한 셀을 사용하도록 설정
    }
}

그리고 IGListCollectionViewDelegateLayout 프로토콜의 didSetSelecteddidDeselect 메서드를 사용하여 선택 및 선택 해제 이벤트를 처리할 수도 있습니다.

class MyCollectionViewLayout: UICollectionViewFlowLayout, IGListCollectionViewDelegateLayout {
    
    func didSelect(_ sectionController: IGListSectionController, with view: UIView) {
        // 셀 선택 시 수행할 작업
    }
    
    func didDeselect(_ sectionController: IGListSectionController, with view: UIView) {
        // 셀 선택 해제 시 수행할 작업
    }
}

셀 재사용을 활성화하려면 UICollectionViewDelegateFlowLayoutcollectionView(_:shouldDeselectItemAt:) 메서드를 사용하여 선택을 해제해야 합니다.

extension MyViewController: UICollectionViewDelegateFlowLayout {
    
    func collectionView(_ collectionView: UICollectionView, shouldDeselectItemAt indexPath: IndexPath) -> Bool {
        return true // 셀 선택 해제를 허용
    }
}

데이터 업데이트하기

IGListKit은 데이터의 변경을 감지하고 컬렉션 뷰에 반영하는 기능을 제공합니다. 이를 위해 IGListAdapter를 사용합니다.

먼저, IGListAdapter를 생성하고 컬렉션 뷰와 데이터 소스를 지정해야 합니다.

let adapter = IGListAdapter(updater: IGListAdapterUpdater(), viewController: self, workingRangeSize: 0)
adapter.collectionView = collectionView
adapter.dataSource = self

그리고 IGListAdapterDataSource 프로토콜을 준수해야 하는 데이터 소스를 구현해야 합니다.

class MyDataSource: NSObject, IGListAdapterDataSource {

    func objects(for listAdapter: IGListAdapter) -> [IGListDiffable] {
        // 데이터 소스 객체 반환
    }
    
    func listAdapter(_ listAdapter: IGListAdapter, sectionControllerFor object: Any) -> IGListSectionController {
        // 새로운 섹션 컨트롤러 반환
    }
    
    func emptyView(for listAdapter: IGListAdapter) -> UIView? {
        // 비어있는 경우 표시할 뷰 반환
    }
}

데이터의 변경이 발생하면 IGListAdapterDataSourcelistAdapter(_:sectionControllerFor:) 메서드가 호출되어 해당 섹션 컨트롤러를 생성합니다. 그리고 IGListAdapterUpdater를 사용하여 변경된 데이터를 컬렉션 뷰에 반영합니다.

adapter.performUpdates(animated: true, completion: nil)

결론

IGListKit을 사용하면 컬렉션 뷰의 셀을 재사용하기 쉽고, 데이터의 변경도 간편하게 반영할 수 있습니다. IGListKit을 활용하여 앱의 컬렉션 뷰를 더욱 효율적으로 구성하세요.

참고 자료