[swift] Swift IGListKit을 사용한 컬렉션 뷰 셀 선택상태 관리하기
IGListKit은 iOS 앱에서 컬렉션 뷰를 더욱 쉽고 효율적으로 관리할 수 있도록 도와주는 라이브러리입니다. 이번에는 IGListKit을 사용하여 컬렉션 뷰 셀의 선택 상태를 관리하는 방법에 대해 알아보겠습니다.
IGListKit 설치하기
먼저, IGListKit을 설치해야 합니다. 다음 명령어를 이용하여 CocoaPods을 통해 IGListKit을 설치합니다.
pod 'IGListKit'
IGListKit을 사용하여 컬렉션 뷰 구성하기
IGListKit을 사용하여 컬렉션 뷰를 구성하는 방법은 다음과 같습니다.
- IGListAdapter 생성하기
let adapter = ListAdapter(updater: ListAdapterUpdater(), viewController: self) adapter.collectionView = collectionView adapter.dataSource = self
-
데이터 모델과 셀 클래스 생성하기 ```swift class MyDataModel { let title: String var isSelected: Bool
init(title: String, isSelected: Bool) { self.title = title self.isSelected = isSelected } }
class MyCell: UICollectionViewCell { // 셀의 UI 요소 정의 // … }
3. 데이터 소스 구현하기
```swift
extension ViewController: ListAdapterDataSource {
func objects(for listAdapter: ListAdapter) -> [ListDiffable] {
// 데이터 모델을 리턴
return myDataModels
}
func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {
return MySectionController()
}
func emptyView(for listAdapter: ListAdapter) -> UIView? {
return nil
}
}
- 섹션 컨트롤러 구현하기
class MySectionController: ListSectionController { var object: MyDataModel? override func sizeForItem(at index: Int) -> CGSize { // 셀의 크기 반환 // ... } override func cellForItem(at index: Int) -> UICollectionViewCell { guard let cell = collectionContext?.dequeueReusableCell(of: MyCell.self, for: self, at: index) as? MyCell else { fatalError("Unable to dequeue cell") } // 셀의 내용 업데이트 cell.titleLabel.text = object?.title cell.isSelected = object?.isSelected ?? false return cell } override func didUpdate(to object: Any) { self.object = object as? MyDataModel } }
셀 선택 상태 관리하기
IGListKit을 사용하여 컬렉션 뷰의 셀 선택 상태를 관리하기 위해서는 다음과 같은 방법을 사용할 수 있습니다.
- MyDataModel에 isSelected 프로퍼티 추가하기
class MyDataModel { let title: String var isSelected: Bool init(title: String, isSelected: Bool) { self.title = title self.isSelected = isSelected } }
- MyCell 클래스에서 선택 상태에 따라 UI 변경하기
class MyCell: UICollectionViewCell { // 셀의 UI 요소 정의 // ... override var isSelected: Bool { didSet { if isSelected { // 선택 상태에 따른 스타일 적용 // ... } else { // 선택 상태에 따른 스타일 적용 // ... } } } }
- MySectionController 클래스에서 셀 선택 상태 업데이트하기
class MySectionController: ListSectionController { // ... override func didSelectItem(at index: Int) { if let object = object { // 선택한 셀의 isSelected 업데이트 object.isSelected.toggle() // 선택한 셀만 업데이트 collectionContext?.performBatch(animated: true, updates: { batchContext in batchContext.reload(self) }, completion: nil) } } }
위와 같이 IGListKit을 사용하여 컬렉션 뷰 셀의 선택 상태를 관리할 수 있습니다. IGListKit은 데이터 모델과 UI 간의 분리를 통해 관리의 용이성을 높여주므로, 복잡한 컬렉션 뷰의 코드를 간결하게 유지할 수 있습니다.
참고 자료
- IGListKit 공식 문서: https://github.com/instagram/IGListKit
- IGListKit 예제 프로젝트: https://github.com/Instagram/IGListKit/tree/master/Examples/IGListDiffableDataSource