[swift] Swift IGListKit에서 컬렉션 뷰 셀 필터링하기

Swift IGListKit는 컬렉션 뷰 기반의 사용자 인터페이스를 구축하기 위한 강력한 도구입니다. IGListKit은 데이터 소스와 섹션 컨트롤러를 통해 데이터를 표시하고, 데이터의 변경을 감지하여 효율적으로 업데이트할 수 있는 기능을 제공합니다.

IGListKit을 사용하여 컬렉션 뷰 셀을 필터링하는 방법을 알아보겠습니다. 필터링된 데이터는 특정 기준에 따라 보여지거나 숨겨집니다.

데이터 소스 구성하기

먼저, 필터링할 데이터 소스를 구성해야 합니다. 예를 들어, 사용자의 할 일 목록을 표시하는 경우를 가정해보겠습니다. 각 할 일은 “제목”과 “완료 여부”라는 속성을 가지고 있습니다.

struct TodoItem {
    let title: String
    let isCompleted: Bool
}

class TodoListDataSource: NSObject, ListAdapterDataSource {
    var allItems: [TodoItem] = []
    var filteredItems: [TodoItem] = []
    var isFiltering: Bool = false

    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {
        return isFiltering ? filteredItems : allItems
    }

    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {
        return TodoSectionController()
    }

    func emptyView(for listAdapter: ListAdapter) -> UIView? {
        return nil
    }
}

TodoListDataSource 클래스는 IGListKit의 ListAdapterDataSource 프로토콜을 구현하여 데이터를 관리합니다. allItems 속성은 전체 할 일 목록을, filteredItems 속성은 필터링된 할 일 목록을 저장합니다. isFiltering 속성은 현재 필터링 중인지 여부를 나타냅니다.

필터링 기능 추가하기

이제, 필터링 기능을 추가해보겠습니다. 사용자가 특정 조건을 선택하면 해당 조건에 맞게 할 일 목록이 필터링됩니다.

extension TodoListDataSource {
    func filterItems(completed: Bool) {
        isFiltering = true
        filteredItems = allItems.filter { $0.isCompleted == completed }
        // 필터링된 목록을 업데이트하기 위해 IGListKit의 update(animated:completion:) 메서드 호출
        listAdapter?.performUpdates(animated: true, completion: nil)
    }

    func clearFilter() {
        isFiltering = false
        // 필터링 상태를 false로 설정하고 전체 목록을 다시 표시
        listAdapter?.performUpdates(animated: true, completion: nil)
    }
}

filterItems(completed:) 메서드는 특정 조건에 따라 목록을 필터링하고, clearFilter() 메서드는 필터링을 해제합니다. 필터링 상태가 변경될 때마다 update(animated:completion:) 메서드를 호출하여 컬렉션 뷰를 업데이트합니다.

필터링 기능 사용하기

마지막으로, 사용자 인터페이스에 필터링 기능을 추가해야 합니다. 예를 들어, 체크박스를 통해 완료된 할 일을 필터링하고 해제할 수 있는 기능을 추가해보겠습니다.

class ViewController: UIViewController {
    let todoListDataSource = TodoListDataSource()

    @IBOutlet weak var collectionView: UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let adapter = ListAdapter(updater: ListAdapterUpdater(), viewController: self)
        adapter.collectionView = collectionView
        adapter.dataSource = todoListDataSource
    }

    @IBAction func filterSwitchChanged(_ sender: UISwitch) {
        let completed = sender.isOn
        if completed {
            todoListDataSource.filterItems(completed: true)
        } else {
            todoListDataSource.clearFilter()
        }
    }
}

위의 코드에서 filterSwitchChanged(_:) 메서드는 체크박스의 상태에 따라 할 일 목록을 필터링하거나 해제합니다. TodoListDataSource 인스턴스에 대한 참조를 보관하는 todoListDataSource 속성을 사용하여 필터링 기능을 호출합니다.

이제 IGListKit을 사용하여 컬렉션 뷰의 셀을 필터링하는 방법을 알았습니다. IGListKit은 데이터의 변경을 감지하고 효율적으로 업데이트하는 기능을 제공하기 때문에 대규모 데이터 세트의 관리에 효과적입니다.

참고 자료