[swift] 모달 뷰에서 데이터를 다른 뷰로 전달하는 방법은?

델리게이트를 사용하는 방법

델리게이트를 사용하면 모달 뷰에서 발생한 이벤트를 처리하는 뷰 컨트롤러로 데이터를 전달할 수 있습니다. 델리게이트 패턴을 구현하여 모달 뷰에서 사용자 입력에 따라 델리게이트 메서드를 호출하고, 해당 메서드를 구현한 뷰 컨트롤러에서 데이터를 전달할 수 있습니다.

protocol ModalViewControllerDelegate: AnyObject {
    func modalViewController(_ controller: ModalViewController, didTapButtonWithData data: String)
}

class ModalViewController: UIViewController {
    weak var delegate: ModalViewControllerDelegate?

    // 모달 뷰 내에서 버튼을 탭할 때 호출되는 메서드
    @IBAction func buttonTapped() {
        delegate?.modalViewController(self, didTapButtonWithData: "Hello, world!")
    }
}

class MainViewController: UIViewController, ModalViewControllerDelegate {
    func openModal() {
        let modalVC = ModalViewController()
        modalVC.delegate = self
        present(modalVC, animated: true, completion: nil)
    }

    // 모달 뷰에서 전달받은 데이터를 처리하는 델리게이트 메서드
    func modalViewController(_ controller: ModalViewController, didTapButtonWithData data: String) {
        print("Data received from modal view: \(data)")
    }
}

클로저를 사용하는 방법

클로저를 사용하여 모달 뷰에서 발생한 이벤트에 대한 처리 로직을 정의하고, 해당 클로저를 호출한 뷰 컨트롤러로 데이터를 전달할 수 있습니다.

class ModalViewController: UIViewController {
    var didTapButton: ((String) -> Void)?

    // 모달 뷰 내에서 버튼을 탭할 때 클로저를 호출하여 데이터를 전달
    @IBAction func buttonTapped() {
        didTapButton?("Hello, world!")
    }
}

class MainViewController: UIViewController {
    func openModal() {
        let modalVC = ModalViewController()
        modalVC.didTapButton = { data in
            print("Data received from modal view: \(data)")
        }
        present(modalVC, animated: true, completion: nil)
    }
}

델리게이트와 클로저 중 선택하여 사용하시면 됩니다. 올바른 데이터 전달 방식을 선택하고, 콜백을 통해 모달 뷰에서 메인 뷰로 데이터를 전달할 수 있습니다.