[swift] IGListKit에서 컨트롤러와 리스트 어댑터 연결하는 방법

IGListKit은 iOS 앱에서 복잡한 리스트 인터페이스를 구현하는 데 사용할 수 있는 강력한 라이브러리입니다. IGListKit에서 컨트롤러와 리스트 어댑터를 연결하는 방법은 간단합니다. 아래는 IGListKit에서 컨트롤러와 리스트 어댑터를 연결하는 예제입니다.

먼저, IGListKit을 프로젝트에 추가해야 합니다. CocoaPods를 사용한다면 Podfile에 다음을 추가하고, 해당 디렉토리에서 pod install 명령을 실행하세요:

pod 'IGListKit'

그런 다음, IGListKit에서 제공하는 IGListCollectionView를 이용하여 컨트롤러의 뷰 계층에 컬렉션 뷰를 추가합니다. 이를 위해 다음 코드를 해당 컨트롤러의 viewDidLoad 메서드에 추가하세요:

import IGListKit

class MyViewController: UIViewController {

    var collectionView: IGListCollectionView!
    var adapter: ListAdapter!

    override func viewDidLoad() {
        super.viewDidLoad()

        let layout = UICollectionViewFlowLayout()
        self.collectionView = IGListCollectionView(frame: .zero, collectionViewLayout: layout)
        self.view.addSubview(self.collectionView)

        self.adapter = ListAdapter(updater: ListAdapterUpdater(), viewController: self)
        self.adapter.collectionView = self.collectionView
        self.adapter.dataSource = self
    }
}

이제, ListDiffable 프로토콜을 채택하는 리스트 아이템과 ListAdapterDataSource 프로토콜을 구현하는 데이터 소스를 생성해야 합니다. 이 예제에서는 numbers라는 단순한 배열을 데이터로 사용합니다.

extension MyViewController: ListAdapterDataSource {

    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {
        return numbers as [ListDiffable]
    }

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

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

class MySectionController: ListSectionController {

    var number: Int!

    override func sizeForItem(at index: Int) -> CGSize {
        return CGSize(width: collectionContext!.containerSize.width, height: 50)
    }

    override func cellForItem(at index: Int) -> UICollectionViewCell {
        // 셀을 생성하고 데이터를 바인딩하는 코드
        ...
    }
}

struct NumberItem: ListDiffable {

    let number: Int
    let identifier: String

    func diffIdentifier() -> NSObjectProtocol {
        return identifier as NSObjectProtocol
    }

    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {
        guard let object = object as? NumberItem else { return false }
        return number == object.number && identifier == object.identifier
    }
}

이제, IGListKit은 objects(for:) 메서드를 호출하여 데이터를 가져와 리스트를 구성하고, listAdapter(_:sectionControllerFor:) 메서드를 호출하여 각 아이템에 대한 섹션 컨트롤러를 제공합니다.

위 예제에서는 MySectionController라는 커스텀 섹션 컨트롤러를 사용했는데, 해당 섹션 컨트롤러를 구현해야 합니다. sizeForItem(at:) 메서드에서 아이템의 크기를 지정하고, cellForItem(at:) 메서드에서 아이템에 해당하는 셀을 생성하고 데이터를 바인딩합니다.

마지막으로, IGListKit은 ListAdapter를 이용하여 리스트를 업데이트하고 뷰에 반영합니다. updater 파라미터에는 ListAdapterUpdater 객체를 생성하여 전달하면 됩니다.

이제 컨트롤러와 리스트 어댑터가 연결되었습니다. IGListKit은 자동으로 데이터의 변경사항을 감지하고, UI를 업데이트해 줄 것입니다.

참고 자료: