[swift] Swift IGListKit을 사용한 컬렉션 뷰 셀 선택상태 관리하기

IGListKit은 iOS 앱에서 컬렉션 뷰를 더욱 쉽고 효율적으로 관리할 수 있도록 도와주는 라이브러리입니다. 이번에는 IGListKit을 사용하여 컬렉션 뷰 셀의 선택 상태를 관리하는 방법에 대해 알아보겠습니다.

IGListKit 설치하기

먼저, IGListKit을 설치해야 합니다. 다음 명령어를 이용하여 CocoaPods을 통해 IGListKit을 설치합니다.

pod 'IGListKit'

IGListKit을 사용하여 컬렉션 뷰 구성하기

IGListKit을 사용하여 컬렉션 뷰를 구성하는 방법은 다음과 같습니다.

  1. IGListAdapter 생성하기
    let adapter = ListAdapter(updater: ListAdapterUpdater(), viewController: self)
    adapter.collectionView = collectionView
    adapter.dataSource = self
    
  2. 데이터 모델과 셀 클래스 생성하기 ```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
    }
}
  1. 섹션 컨트롤러 구현하기
    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을 사용하여 컬렉션 뷰의 셀 선택 상태를 관리하기 위해서는 다음과 같은 방법을 사용할 수 있습니다.

  1. MyDataModel에 isSelected 프로퍼티 추가하기
    class MyDataModel {
     let title: String
     var isSelected: Bool
        
     init(title: String, isSelected: Bool) {
         self.title = title
         self.isSelected = isSelected
     }
    }
    
  2. MyCell 클래스에서 선택 상태에 따라 UI 변경하기
    class MyCell: UICollectionViewCell {
     // 셀의 UI 요소 정의
     // ...
        
     override var isSelected: Bool {
         didSet {
             if isSelected {
                 // 선택 상태에 따른 스타일 적용
                 // ...
             } else {
                 // 선택 상태에 따른 스타일 적용
                 // ...
             }
         }
     }
    }
    
  3. 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 간의 분리를 통해 관리의 용이성을 높여주므로, 복잡한 컬렉션 뷰의 코드를 간결하게 유지할 수 있습니다.

참고 자료