[ios]cell에서 performSegue 실행(Delegate 패턴 이용)

감자·2020년 12월 4일
0

1. why?

개인 프로젝트를 하면서 collectionCell을 selected했을 때 performSegue를 실행해주어야했는데 cell을 ViewController가 아니여서 바로 performSegue를 할 수 없었다. 그래서 방법을 고민하다 Delegate패턴을 이용했다.

2. how?

protocol MainContainerQuestionDelegate{
    func selectedCell(indexOf : Int)
}

이렇게 프로토콜을 만들어주고

extension MainContainerViewController : MainContainerQuestionDelegate{
    func selectedCell(indexOf: Int) {
        self.performSegue(withIdentifier: "segueForQuestionDetailViewController", sender: nil)
    }
}

cell이 만들어지는 VC에서 만든 프로토콜을 채택해주는 작업을 하고

guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MainContainerQuestionCollectionViewCell", for: indexPath) as? MainContainerQuestionCollectionViewCell else {
                return UICollectionViewCell()
            }
            cell.delegate = self
            return cell
class MainContainerQuestionCollectionViewCell: UICollectionViewCell{
    func selectedCell(indexOf: Int) {
        print("delegate Test")
        self.delegate?.selectedCell(indexOf: indexOf)
    }
    var test : String?
    var delegate:MainContainerQuestionDelegate?
}

VC에서 cell을 만들 때 Cell에 정의한 MainContainerQuestionDelegate타입의 변수 delegate를 VC로 지정해주면된다.

result


이렇게 mainVC에서 중간에 cell을 선택하면 아래와 같이 이동할 수 있게 된다.

요약
ㄱ. 가장 아래에 있는 cell 접근(performSegue 실행)?

  • delegate 패턴 이용

ㄴ. 데이터 뿌려주기

  • 데이터가 모두 받아와지는 시점에서 가장 상위에 collectionView를 reload 시켜주면 됨(2번 reload())

Appendix

위에 Result로 보여준 view의 구성


1번 = viewController
2번 = CollectionView
3번 = CollectionViewCell
4번 = CollectionView
-4번.Delegate = 3
-4번.DataSource = 3

5번 = CollectionViewCell

0개의 댓글