delegate

ulls12·2023년 12월 29일
0

Swift TIL

목록 보기
24/60
post-thumbnail

Delegate

Xib파일의 IBAction을 ViewController로 직접 연결이 불가능하다. 우리는 delegate 패턴을 사용하여 연결을 해줘야한다.

  • 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가 뜨면서 모든 함수를 구성하라고 뜬다. 이러한 장점은 코드 구성을 할 때 놓치는 부분을 줄여주고 코드가 낭비되는 것을 막아주는 역할을 한다

profile
I am 개발해요

0개의 댓글