[iOS] 델리게이트(Delegate)

728x90

델리게이트(Delegate)에 대해 알아 보겠습니다.

Delegate

자신이 할 일을 다른 인스턴스에게 대신 처리하도록 구현하는 디자인 패턴
쉽게, 델리게이트는 어떤 객체가 해야 하는 일을 부분적으로 확장해서 대신 처리를 한다. 라고 정의 하고 싶습니다.

주로 다음과 같은 상황에 사용

  • 뷰가 받은 이벤트나 상태를 뷰컨트롤러에게 전달하여 처리하도록 함 (View -> ViewController)
  • 뷰 구성에 필요한 정보를 뷰컨트롤러가 결정하도록 함 (View <- ViewController)
  • 주요 코드는 숨기고 가능한 특정 상황에 대해서만 커스터마이징 할 수 있도록 제공

 

델리게이트에 대해 더 이해하려면
요청하는 객체(선언부)와 요청에 응답할 객체(구현부) 두가지를 꼭 기억 해야됩니다.

코드로 살펴 보겠습니다.

 

요청하는 객체

//1번!!!!!!!!!!!!!!!!!
protocol CustomViewDelegate: class {
    func viewFrameChanged(newFrame:CGRect)
}

class CustomView: UIView {

    //2번!!!!!!!!!!!!!!!!!
    weak var delegate: CustomViewDelegate? // 프로토콜 타입

    override func layoutSubviews() {
        //delegate는 옵셔널이기때문에 어떠한 값이 들어와야된다.
        //어떠한 객체.viewFrameChanged(:)라는 메서드를 호출! 한다고 생각하세요. 호출은 여기서 하는 겁니다!
        delegate?.viewFrameChanged(newFrame: frame) //3번!!!!!!!!!!!!!!!!!
    }
}

위의 코드를 선언부라고 생각해봅시다.

1번 : 프로토콜 생성부분

2번 : 클래스에 delegate프로퍼티를 생성
     - 일반적으로 delegate란 이름을 사용
     - 타입은 프로토콜 추상화 타입

3번 : delegate 인스턴스의 메소드 실행

 

현재 customView입장에선 delegate instance가 존재하는지 모른다!

하지만 어떤 Instance(A)가 나의 delegate instance값을 할당했다면, A는 나의 프로토콜을 채택했으며 메소드를 구현했다는 것을 인지하고 있다.

delegate method를 사용해서 메소드 실행 및 리턴값을 받아와 사용

 

요청에 응답할 객체

// 1번!!!!!!!!!!!!!!!!!!
class ViewController: UIViewController, CustomViewDelegate {

    let customView = CustomView(frame: CGRect(x: 100, y: 250, width: 200, height: 100))

    override func viewDidLoad() {
        super.viewDidLoad()

        let customView = CustomView()

        // CumsomView에서는 어떤놈이 올지 모르니까 self로 지정을 해서 self(현재 ViewController)의 객체가 오면 실행 해달라고 인스턴스를 보내는 작업.
        customView.delegate = self //3번!!!!!!!!!!!!!


        view.addSubview(customView)
    }

    //2번!!!!!!!!!!!!!!!
    func viewFrameChanged(newFrame: CGRect) {

        // CustomView 의 프레임이 변경될 때마다 실행할 코드 작성
        print(print("changed Frame : \(newFrame)"))
    }
}

위의 코드를 구현부라고 생각해봅시다.

1번 : CustomView Delegate 채택
2번 : 채택한 Delegate 메소드 구현
3번 : Custom instance의 delegate 프로퍼티에 자기 자신의 인스턴스를 할당(프로토콜 추상화 타입)
       - ViewController입장에선, 내가 구현한 메소드를 실행하진 않지만, customView가 적절한 곳에서 호출 했을것이다.
       - customView가 특정 위치에 해당 메소드를 호출할 것을 예상하여 필요한 행동을 구현한다.

 

즉, 선언부에서 layoutSubviews()가 실행 될때마다 delegate?.viewFrameChanged(newFrame: frame)가 실행 됩니다.
여기서 delegate는 구현부에서 customView.delegate = self라고 볼 수 있어서 customView.viewFrameChanged(newFrame: frame)라고 보시면 됩니다!

'iOS' 카테고리의 다른 글

[iOS] 앱 샌드박스(App Sandbox)와 Container Directory  (1) 2019.07.24
[iOS] 오토레이아웃(AutoLayout)과 Layout 개념  (0) 2019.07.23
[iOS] UserDefaults  (0) 2019.07.23
[iOS] 싱글턴(Singleton) in Swift  (0) 2019.07.23
[iOS] Code Snippet  (0) 2019.07.23