Xib파일의 IBAction을 ViewController로 직접 연결이 불가능하다. 우리는 delegate 패턴을 사용하여 연결을 해줘야한다.
우선 Xib파일에서 델리게이트 프로토콜을 생성해주고 함수를 넣어주고 IBAction에서 delegate메서드를 설정해준다.
//CategorySackView.swift 파일
@IBAction func TapMainMenu(_ sender: Any) {
print("메인메뉴 선택")
delegate?.changeToMenu(type: .mainMenu)
}
protocol CategoryStackViewDelegate: AnyObject {
func changeToMenu(type: ViewController.MenuType)
}
이제 viewController에서 CategoryViewDelegate를 확장하여 class에서도 사용할 수 있도록 해준다. collectionview의 데이터를 리로드해주는 메서드를 설정해주고 뷰를 로드하는 함수에 delegate를 viewcontroller에 할당 시켜줘야 한다.
//ViewController.swift 파일
class ViewController: UIViewController {
@IBOutlet var menuCollection: UICollectionView!
//스토리보드의 콜렉션뷰를 IBOutlet으로 변수 설정을 해준다
override func viewDidLoad() {
super.viewDidLoad()
categoryStackView.delegate = self
//뷰가 로드되는 곳에 스택뷰를 뷰컨트롤러에 할당시킨다
}
func reloadMenu(type: MenuType) {
currentMenuType = type
menuCollection.reloadData() //화면 갱신
}
}
extension ViewController: CategoryStackViewDelegate {
func changeToMenu(type: MenuType) {
print(#function)
//함수가 제대로 작동했는지 빌드 후 확인하는 절차
reloadMenu(type: type)
/*reloadMenu의 함수의 타입값은 Xib의 IBAction에서 정의를 해주었고
그 타입 값을 호출한다*/
}
}
protocol의 장점은 구성한 값들을 extension에서 구현해놓지 않으면 error가 뜨면서 모든 함수를 구성하라고 뜬다. 이러한 장점은 코드 구성을 할 때 놓치는 부분을 줄여주고 코드가 낭비되는 것을 막아주는 역할을 한다