[IOS] performSegue를 사용하여 뷰 컨트롤러 간에 데이터를 전달하는 방법

performSegue를 사용하여 뷰 컨트롤러 간에 데이터를 전달하는 방법은 iOS 앱 개발에서 자주 사용되는 기능 중 하나입니다. 데이터를 전달하는 방법은 여러 가지가 있지만, 여기서는 두 가지 일반적인 방법을 설명하겠습니다.

1. Segue를 통한 데이터 전달: 이 방법은 데이터를 전달할 뷰 컨트롤러에서 prepare(for:sender:) 메서드를 오버라이드하여 데이터를 받는 뷰 컨트롤러로 전달하는 방법입니다.

보내는 뷰 컨트롤러:

class SendingViewController: UIViewController {
    // 전달할 데이터를 준비
    var dataToSend: String = "Hello, destination!"
    
    // Segue를 실행할 액션 메서드
    @IBAction func performSegueButtonTapped(_ sender: UIButton) {
        performSegue(withIdentifier: "YourSegueIdentifier", sender: self)
    }
    
    // Segue를 실행하기 전에 호출되는 메서드
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "YourSegueIdentifier" {
            // 데이터를 받는 뷰 컨트롤러에 데이터 전달
            if let destinationVC = segue.destination as? ReceivingViewController {
                destinationVC.receivedData = dataToSend
            }
        }
    }
}

받는 뷰 컨트롤러:

class ReceivingViewController: UIViewController {
    // 받은 데이터를 저장할 변수
    var receivedData: String = ""
    
    // 데이터 사용
    override func viewDidLoad() {
        super.viewDidLoad()
        print(receivedData) // "Hello, destination!"
    }
}

2. 뷰 컨트롤러 인스턴스 변수를 활용한 데이터 전달: 이 방법은 보내는 뷰 컨트롤러에서 받는 뷰 컨트롤러의 인스턴스 변수에 직접 데이터를 할당하는 방법입니다.

보내는 뷰 컨트롤러:

class SendingViewController: UIViewController {
    // Segue를 실행할 액션 메서드
    @IBAction func performSegueButtonTapped(_ sender: UIButton) {
        performSegue(withIdentifier: "YourSegueIdentifier", sender: self)
    }
    
    // Segue를 실행하기 전에 호출되는 메서드
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "YourSegueIdentifier" {
            // 데이터를 받는 뷰 컨트롤러의 인스턴스를 가져와서 데이터 전달
            if let destinationVC = segue.destination as? ReceivingViewController {
                destinationVC.receivedData = "Hello, destination!"
            }
        }
    }
}

받는 뷰 컨트롤러:

class ReceivingViewController: UIViewController {
    // 받은 데이터를 저장할 변수
    var receivedData: String = ""
    
    // 데이터 사용
    override func viewDidLoad() {
        super.viewDidLoad()
        print(receivedData) // "Hello, destination!"
    }
}

이러한 방법을 사용하여 performSegue를 통해 데이터를 성공적으로 전달할 수 있습니다. 전달할 데이터의 유형에 따라 적절한 데이터 타입을 사용하여 데이터를 전달해야 합니다.

performSegue(withIdentifier:sender:) 메서드를 사용하여 화면 전환을 수행할 때 데이터를 전달하는 방법은 아래와 같이 두 가지 방법으로 나뉩니다. 아래의 예시는 Swift 언어를 기준으로 설명합니다.

1. Segue를 통한 데이터 전달

Segue를 통해 다음 화면으로 데이터를 전달하는 방법은 prepare(for:sender:) 메서드를 사용하는 것입니다. 이 메서드는 Segue가 수행되기 전에 호출되며, 여기서 데이터를 다음 화면으로 전달할 수 있습니다.

1-1. 데이터를 전달할 다음 화면(View Controller)를 정의합니다. (이 예시에서는 “NextViewController”라고 가정합니다.)

import UIKit

class NextViewController: UIViewController {
    var receivedData: String?
    
    // 이후 데이터를 사용하는 로직을 작성할 수 있습니다.
}

1-2. 데이터를 전달하는 화면에서 prepare(for:sender:) 메서드를 구현합니다.

import UIKit

class CurrentViewController: UIViewController {
    // 전달할 데이터를 정의합니다.
    let dataToSend = "Hello, Next View Controller!"
    
    // 다음 화면으로 데이터를 전달하는 메서드를 구현합니다.
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "YourSegueIdentifier" { // Segue의 Identifier를 적절하게 변경해주세요.
            if let nextViewController = segue.destination as? NextViewController {
                nextViewController.receivedData = dataToSend
            }
        }
    }

    // 다음 화면으로 전환하는 버튼을 누르면 Segue를 수행합니다.
    @IBAction func goToNextScreenButtonTapped(_ sender: UIButton) {
        performSegue(withIdentifier: "YourSegueIdentifier", sender: self) // Segue의 Identifier를 적절하게 변경해주세요.
    }
}

2. 직접 인스턴스를 생성하여 데이터 전달

Segue를 사용하지 않고, 다음 화면의 인스턴스를 직접 생성하여 데이터를 전달하는 방법입니다. 이 방법은 Segue를 사용하지 않으므로, 화면 전환을 수동으로 처리해야 합니다.

2-1. 데이터를 전달할 다음 화면(View Controller)를 정의합니다. (이 예시에서는 “NextViewController”라고 가정합니다.)

import UIKit

class NextViewController: UIViewController {
    var receivedData: String?
    
    // 이후 데이터를 사용하는 로직을 작성할 수 있습니다.
}

2-2. 데이터를 전달하는 화면에서 다음 화면의 인스턴스를 직접 생성하고 데이터를 전달합니다.

import UIKit

class CurrentViewController: UIViewController {
    // 전달할 데이터를 정의합니다.
    let dataToSend = "Hello, Next View Controller!"
    
    // 다음 화면으로 데이터를 전달하는 메서드를 호출합니다.
    @IBAction func goToNextScreenButtonTapped(_ sender: UIButton) {
        let storyboard = UIStoryboard(name: "Main", bundle: nil) // Main.storyboard 파일명으로 변경해주세요.
        if let nextViewController = storyboard.instantiateViewController(withIdentifier: "NextViewController") as? NextViewController {
            nextViewController.receivedData = dataToSend
            navigationController?.pushViewController(nextViewController, animated: true)
        }
    }
}

위의 두 가지 방법 중 하나를 선택하여 데이터를 다음 화면으로 전달할 수 있습니다. Segue를 통한 전환은 Interface Builder에서 화면 전환을 설정하고 수행하는 방식이므로 더 간단한 방법입니다. 반면에 직접 인스턴스를 생성하여 전환하는 방법은 Segue를 사용하지 않으므로, 더 많은 제어권을 가지고 화면 전환을 처리할 수 있습니다. 사용에 따라 적절한 방법을 선택하시면 됩니다.