delegate으로 데이터 전달

라무·2023년 8월 9일

예시


실행순서

  1. popupDelegate를 정의해줄 파일을 하나 생성해준다 → 프로토콜이라는 리모컨을 만든 것

    • 이 delegate를 통해서 리모컨 역할을 한다
      • 프로토콜은 여러 함수를 가질 수 있다 → 즉, 리모콘이 여러 번호를 가지고 있듯이 프로토콜도 여러 함수를 가지고 있는 것이다 → 그리고 이 프로토콜을 준수하는 클래스는 프로토콜의 함수들을 가지고 있어야 한다
    1. 프로토콜을 선언해준다
    2. 아래 delegate를 통해서 함수의 내용을 정의해줄 함수를 미리 선언한다
    protocol PopUpDelegate {
        func onOpenChatBtnClicked() 
    
    		func countUp()
    		func sendUserInfo(info: String) 
    }
  2. Main viewController에서 PopUpDelegate를 채택한다 → 대신 수행해주는 부분

    • 프로토콜을 채택한 다는 것의 의미는?
      • 프로토콜에 정의된 함수를 가지고 있다는 것을 의미한다
      • 그리고 onOpenChatBtnClicked라는 함수로 이벤트를 받기 위해서 ViewController는 PopUpDelegate이라는 것 자체를 변수에 올린다(메모리에 올린다)
      • 즉, 변수에 올린다 = 메모리에 올린다
      • +1 = 2은 1, 1, +, =, 2 등으로 메모리에 올라가듯이
      • onOpenChatBtnClicked()함수가 메모리에 올라간다
    • 여기서는 안테나 수신을 해준다는 것을 의미한다
    • PopUpDelegate가 PopUpDelegate의 함수들 중 하나를 실행하면 여기서 그 함수를 받아서 실행하겠다는 것을 의미한다
    class ViewController: UIViewController, PopUpDelegate {
    	func onOpenChatBtnClicked() {
          //오픈 카톡방 가기 버튼에 대한 이벤트를 여기서 처리를 하게 됨
        }
    }
  3. CustomPopUpView에서 PopUpDeleate의 자료형을 설정해준고 MainViewController와 연결시켜준다

    • 여기서 이걸 설정해주는 이유는,,?
      • main viewController에서 이벤트를 받기 위해서는 이벤트를 전달하는 쪽이 필요하다 → 즉, 조작하는 부분
      • 리모컨을 눌러주는 부분에 해당한다
    • CustomPopUpViewController는 멤버변수로 myPopUpDelegate를 가지고 있다
      • myPopUpDelegate의 메모리 주소가 어디를 가리키고 있을까?
        • main viewController의 customPopUpVC.myPopViewController = self를 통해서 mainViewController의 PopUpDelegate를 가르키게 된다
        • 즉, MainViewController는 PopUpDelegate프로토콜을 채택하면서 PopUpDelegate를 변수로 올렸고(메모리에 올렸고) 그 메모리를 CustomPopUpViewController의 멤버변수의 값으로 연결시켜 준것
          • 즉, myPopUpDelegate가 customPopUpVC의 PopUpDelegate의 주소를 가르킨다
          • customPopUpVC.myPopUpDelegate = self가 주소 설정부분
          • 이걸 통해서 mainViewController와 customPopUpViewController가 서로 연결되어있는 것을 알 수 있다!!!!!
        • customPopUpVC.myPopUpDelegate = self 부분은 ViewController의 메모리 주소 자체를 넘긴다
          • 그래서 어떤 함수가 실행되면 ViewController에서 해당 함수를 찾아서 정의해놓은대로 실행을 하게 된다
    • 안테나를 수신하는 부분과 발신하는 부분을 서로 연결해줘야 한다
    //안테나 발신
    class CustomPopUpViewController: UIViewController {
    	var myPopUpDelegate : PopUpDelegate? //자료형이 팝업 델리케이트
    }
    
    //안테나 수신
    class ViewController: UIViewController, PopUpDelegate {
    	customPopUpVC.myPopUpDelegate = self
    }
  4. CustomPopUpView에서 설정해준 PopUpDelegate를 발동시켜줘야 한다 → 즉, 함수를 실행시켜줘야 한다

    • 리모컨 버튼을 누른 것(ex. 리모컨에서 14번 채널로 가줘! 라고 한 것을 의미한다)
    • 여기서 이벤트가 발생했다고 main viewController에 알린 것이다
      • 위에서 myPopUpDelegate의 메모리 주소가 CustomPopUpViewController의 PopUpDelegate를 가르키고 있으니까 이걸 통해 이벤트가 전달된다!
    • 그럼 이 이벤트를 실행하겠다고 하는 것이 필요하다(즉, 수신하는 것이 필요하다) → 이걸 수신하는 것이 main viewController가 되는 것이다
    • 그리고 viewController의 PopUpDelegate가 수신기가 되어서 onOpenChatBtnClicked함수의 내용이 실행되는 것이다
    @IBAction func onOpenChatBtnClicked(_ sender: UIButton!) {
            print("custompopupViewcontroller - onOpenChatBtnClicked() called")
            
            //리모컨을 누른 것 -> 즉, 이벤트가 발생했다고 viewController에 알린 것
            //그럼 이 이벤트를 실행하겠다고(리모컨을 누른 것) 그걸 수신하는 것이 필요하다 -> 이걸 수신하는 것이 viewController가 되는 것
            //그리고 viewController가 수신기가 되어서 onOpenChatBtnClicked함수의 내용이 실행되는 것
            myPopUpDelegate?.onOpenChatBtnClicked()
            self.dismiss(animated: true)
        }
  5. 오픈 카톡방 가기를 누른다면 거기에 실행해야 할 함수를 정의

    • customPopUpViewController에서 onOpenChatBtnClicked라는 함수를 호출하면 여기서 그 호출부분을 수신해서 실행??(질문4)
    @IBAction func onOpenChatBtnClicked(_ sender: UIButton!) {
      print("custompopupViewcontroller - onOpenChatBtnClicked() called")
    	let myChallerUrl = URL(string: "https://open.kakao.com/o/gTO6LbTe")
      self.myWebView.load(URLRequest(url: myChallerUrl!))
    }
profile
ios 개발을 하고있는 라무의 사적인 기술 블로그

0개의 댓글