티스토리 뷰

728x90

아래 같은 상황처럼 

Detail VC (내용수정) -> 저장 -> 화면 dismiss -> Main VC에 반영

위의 기능을 해보려고 합니다. 

 

ViewController 간에 데이터를 전달하는 방법은 Notification, Delegate 등이 있는데

 

오늘은 Delegate를 이용한 데이터 전달 방법에 대해 공부해 보겠습니다.


 

Detail VC (데이터를 보내는곳)

 

Delegate 패턴을 적용하기 위해선 

protocol을 사용해야 하는데요. 

해당 protocol은 채택, 준수, 대리자 위임을 해줘야 합니다. 

 

먼저 protocol을 생성해 줍니다. (SendDataDelegate)

 

 

// DetailViewController.swift

protocol SendDataDelegate {        // 프로토콜 선언
    func sendData(data: String)
} 

class DetailViewControll: UIViewController {
// ...
}

protocol은 메소드를 정의만 해줘요 구현은 하지 않습니다.

영화로 치면 예고편(trailer) 이라고 생각하시면 됩니다. 

 

예고편을 보면 영화에 어떤 장면들이 나올지 알 수 있듯, 

 

SendDataDelegate 라는 protocol안에 func sendData(data: String) 메소드 라는게 있네 ?

즉, SendDataDelegate를 채택 하고 위임 (.delegate = self) 한 곳 에선 sendData(data: String) 메소드가 어떻게 쓰일지 알 수 있게 해주죠.

 

 

Detail VC 에 protocol 타입의 delegate 변수를 만들어줍니다. 

// DetailViewController.swift

protocol SendDataDelegate {        // 프로토콜 선언
    func sendData(data: String)
} 

class DetailViewControll: UIViewController {
   var delegate: SendDataDelegate?  // 프로토콜 변수 선언   
}

 

그리고 '저장' 버튼을 눌렀을때 데이터를 보낼 부분

// DetailViewController.swift

@objc func saveTapped() {
        if let data = dataTextField.text {
            delegate?.sendData(data: data)  // 데이터 전송
        }
        dismiss(animated: true, completion: nil)
    }

 

textField에 입력된 값이 있을경우 

sendData(data: data)의 인자값에 넣어주게 됩니다.

 

여기까지만 하면 Detail VC 에서 할일은 끝 입니다.

 


Main VC (데이터를 받는곳)

 

1. 채택

Delegate를 이용해서 데이터를 받아올 겁니다. 

먼저 class MainViewController에 SendDataDelegate채택 해줍니다.

// MainViewController.swift

class MainViewController: UIViewController, SendDataDelegate {  // 프로토콜 채택
// ...
}

 

2. 준수

채택을 하게 되면 SendDataDelegate 프로토콜에 있는 메소드 func sendData(data: String) 을 사용해줘야 합니다.

이렇게 해주는걸 '프로토콜을 준수 해준다' 고 합니다. 

NOTE

가독성을 위해 채택을 할때는 extension으로 따로 빼놓는것이 좋습니다. 
extension MainViewController: SendDataDelegate {
    func sendData(data: String) {
        dataLabel.text = data
    }
}

 

3. 위임

 

데이터를 받아올 Detail VC 대리자 위임을 해주기만 하면 끝납니다.

@objc func tappedButton() {
        let detailVC = DetailViewController()
        detailVC.delegate = self   // 대리자 위임
        present(detailVC, animated: true, completion: nil)
    }

여기서 selfMain VC를 말합니다.

여기까지 구현해놓고 실행해보면 !!

 

 

Detail VC -> Main VC 로 데이터가 잘 전달되는걸 볼 수 있습니다!! 

 


 

전체 코드는 Github에 올려 놓았으니 참고하세요!!

저는 Snapkit 라이브러리를 사용해 코드로 작업을 했습니다. 

 

iOS 처음 공부할 때는 delegate가 막막하고 무슨 말인지 하나도 몰랐었는데 

이제 조금씩 코드가 읽히네요 ㅎㅎㅎ 

Delegate 패턴이 자주쓰인다고 하니 추후 많이 써보면서 익혀놔야겠습니다. 

728x90