[swift] IGListDiffKit과 함께하는 클릭 이벤트 처리

IGListDiffKit은 iOS 앱에서 복잡한 리스트 화면을 관리하기 위한 강력한 도구입니다. IGListDiffKit을 사용하면 리스트의 변화를 감지하고 업데이트하는 작업을 간편하게 처리할 수 있습니다. 이번 포스팅에서는 IGListDiffKit을 사용하여 리스트 아이템의 클릭 이벤트를 처리하는 방법에 대해 알아보겠습니다.

IGListSectionController 서브클래싱

IGListDiffKit의 핵심 개념은 section controller입니다. 각각의 section은 독립적으로 관리되며, 화면에 표시되는 리스트 아이템들을 처리합니다. 우리가 직접 정의한 section controller 클래스를 IGListSectionController를 상속받아 만들어서 사용합니다.

class MyListSectionController: IGListSectionController {
    var listItem: ListItem!

    override func numberOfItems() -> Int {
        return 1
    }

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

    override func cellForItem(at index: Int) -> UICollectionViewCell {
        let cell = collectionContext!.dequeueReusableCell(of: MyListCell.self, for: self, at: index) as! MyListCell
        cell.configure(with: listItem)
        return cell
    }

    override func didSelectItem(at index: Int) {
        // 클릭 이벤트 처리
        print("Did select item: \(index)")
    }
}

위 코드에서 MyListSectionController는 간단한 리스트 아이템을 처리하는 section controller 예시입니다. numberOfItems() 함수에서는 해당 section에 표시되는 아이템의 개수를 반환해야 합니다. sizeForItem(at:) 함수에서는 아이템의 크기를 지정하고, cellForItem(at:) 함수에서는 아이템을 표시할 셀을 반환합니다. 마지막으로 didSelectItem(at:) 함수에서 클릭 이벤트를 처리하면 됩니다.

IGListKit 등록하기

이제 생성한 section controller를 IGListKit에 등록해보겠습니다.

class MyViewController: UIViewController, ListAdapterDataSource {
    let adapter = ListAdapter(updater: ListAdapterUpdater(), viewController: nil)

    override func viewDidLoad() {
        super.viewDidLoad()
        
        adapter.collectionView = collectionView
        adapter.dataSource = self
    }

    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {
        // 리스트 아이템 객체를 반환해줍니다.
        return [listItem]
    }

    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {
        // 생성한 section controller를 반환합니다.
        return MyListSectionController()
    }

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

MyViewController에서는 ListAdapterDataSource 프로토콜을 채택하여 IGListKit에 필요한 정보를 제공합니다. objects(for:) 함수에서는 표시할 리스트 아이템 객체를 반환하고, listAdapter(_:sectionControllerFor:) 함수에서는 section controller를 생성하여 반환합니다. 마지막으로 emptyView(for:) 함수에서는 리스트가 비어있는 경우에 표시할 뷰를 반환합니다.

클릭 이벤트 처리하기

이제 클릭 이벤트를 처리하는 코드를 작성해보겠습니다.

class MyListCell: UICollectionViewCell {
    var listItem: ListItem!
    var tapGesture: UITapGestureRecognizer!

    override init(frame: CGRect) {
        super.init(frame: frame)
        
        tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
        contentView.addGestureRecognizer(tapGesture)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    @objc func handleTap(_ sender: UITapGestureRecognizer) {
        // 클릭 이벤트 처리
        print("Did tap cell: \(listItem.title)")
    }

    func configure(with listItem: ListItem) {
        self.listItem = listItem
        // 셀 설정 로직
    }
}

MyListCell에서는 UITapGestureRecognizer를 사용하여 셀을 터치할 때의 이벤트를 처리합니다. handleTap(_:) 함수에서 클릭 이벤트를 처리하면 됩니다. configure(with:) 함수에서는 셀을 설정하는 로직을 구현합니다.

결론

IGListDiffKit을 사용하면 리스트 아이템의 클릭 이벤트를 간편하게 처리할 수 있습니다. IGListKit을 사용하여 각 section을 관리하고, section controller를 통해 클릭 이벤트를 처리할 수 있습니다. 이를 통해 iOS 앱에서 복잡한 리스트 화면을 쉽게 구현할 수 있습니다.

참고: IGListDiffKit 문서