[swift] IGListKit에서 셀의 선택 상태 유지하는 방법

IGListKit은 iOS에서 리스트 기반의 화면을 구현하기 위한 강력한 프레임워크입니다. 그러나 IGListKit을 사용하다보면 셀의 선택 상태를 유지하는 것이 조금 까다로울 수 있습니다. 이번 포스트에서는 IGListKit에서 셀의 선택 상태를 유지하는 방법에 대해 알아보겠습니다.

IGListBindingSectionController 사용하기

IGListBindingSectionController를 사용하면 셀의 선택 상태를 유지하는 것이 간단해집니다. IGListBindingSectionController는 셀의 선택 상태를 바인딩하여 관리하게 해주는 특별한 section controller입니다.

IGListBindingSectionController를 사용하기 위해서는 먼저 IGListBindingSectionController 클래스를 상속받은 커스텀 section controller를 만들어야 합니다. 그리고 선택된 셀의 정보를 저장할 클래스를 정의하고, 이 클래스를 IGListBindingSectionControllerSelectionDelegate 프로토콜을 구현하도록 지정해야 합니다.

class MySectionController: IGListBindingSectionController<MyItem>,
                           IGListBindingSectionControllerDataSource,
                           IGListBindingSectionControllerSelectionDelegate {

    var mySelectedItems: Set<MyItem> = []

    override init() {
        super.init()
        dataSource = self
        selectionDelegate = self
    }

    func sectionController(_ sectionController: IGListBindingSectionController<AnyObject>, didSelectItemWith object: Any) {
        guard let item = object as? MyItem else { return }
        mySelectedItems.insert(item)
        updateSelection(for: visibleCells())
    }

    func sectionController(_ sectionController: IGListBindingSectionController<AnyObject>, didDeselectItemWith object: Any) {
        guard let item = object as? MyItem else { return }
        mySelectedItems.remove(item)
        updateSelection(for: visibleCells())
    }

    func updateSelection(for cells: [UICollectionViewCell]) {
        for cell in cells {
            guard let cell = cell as? MyCell else { continue }
            cell.isSelected = mySelectedItems.contains(cell.item)
        }
    }

    // ...
}

위 코드에서 MyItem은 데이터 모델을 나타내는 클래스이고, MyCell은 커스텀 셀을 나타내는 클래스입니다.

선택된 셀 처리하기

이제 선택된 셀을 처리하는 방법에 대해 알아보겠습니다. 선택된 셀의 처리는 커스텀 셀의 isSelected 프로퍼티를 이용하여 구현할 수 있습니다. MyCell 클래스에서 isSelected 프로퍼티에 따라 셀의 모양을 변경할 수 있습니다.

class MyCell: UICollectionViewCell {

    var item: MyItem?

    override var isSelected: Bool {
        didSet {
            // 셀의 선택 상태에 따라 모양 변경하기
            if isSelected {
                // 선택되었을 때의 처리
                backgroundColor = .blue
            } else {
                // 선택되지 않았을 때의 처리
                backgroundColor = .white
            }
        }
    }

    // ...
}

실행 결과 확인하기

위의 방법으로 구현하면 MyCell 클래스의 isSelected 프로퍼티 값에 따라 셀의 선택 상태가 유지됩니다. 선택된 셀의 모양이 변경되며, 선택이 해제되면 기본 모양으로 돌아갑니다.

이제 IGListBindingSectionController를 사용하여 IGListKit에서 셀의 선택 상태를 유지하는 방법을 배웠습니다. IGListBindingSectionController를 활용하면 IGListKit을 사용하는 앱에서 셀의 선택 상태를 효율적으로 관리할 수 있습니다.

참고 자료: IGListBindingSectionController