iOS/UIKit

[IOS] 화면(ViewController)간 데이터 주고 받기 2 상위->하위

유훈 | Yuhun 2022. 1. 31. 02:01
반응형

d상위에서 하위로 데이터를 전달하는건 delegate pattern을 이용하는 것 보다 간단합니다.

이는 Segue를 이용할 때와 Code를 이용할때 방법이 다릅니다.

 

- 하위에서 상위로 데이터를 전달하는 방법

- 상위에서 하위로 데이터를 전달하는 방법

1. Code를 이용할 때

2. Segue를 이용할 때

 

 

1. Code를 이용할 때

상위 

// 상위 ViewController

class ViewController: UIViewController, SendDataDelegate {
	
    @IBAction func "누르면 이동할 버튼"(_ sender: UIButton) {
        // 스토리보드에서 이름 붙이고 이름을 가져옴
        guard let viewController = self.storyboard?
        .instantiateViewController
        (withIdentifier: "이동할 뷰 컨트롤러")
        as? "이동할 뷰 컨트롤러" else{return}
        
        // 데이터 넘기기
        viewController.name = "전달할 데이터"
        
        // 가져온 ViewController로 Push
        self.navigationController?.pushViewController(viewController, animated: true)
    }
}

하위

// 하위 ViewController

class CodePushViewController: UIViewController {
    @IBOutlet weak var nameLabel: UILabel!
    
    // 상위에서 데이터를 전달할 프로퍼티 미리 정의
    var name: String?
    
    // View가 Load되면 현재 화면의 Label에 받아온 데이터 전달
    override func viewDidLoad() {
        super.viewDidLoad()
        if let name = name {
            // 라벨에 데이터 전달
            self.nameLabel.text = name
        }
    }
    
	   // 돌아가기
       @IBAction func Back(_ sender: UIButton) {
        self.navigationController?.popViewController(animated: true)
    }
}

2. Segue를 이용할 때

상위

// 상위 ViewController

class ViewController: UIViewController, SendDataDelegate {
	
        // Segue되기 직전 실행되는 method override
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        
        	// 전환하려는 뷰 컨트롤러의 instance
	        if let viewController = segue.destination as? "이동할 뷰 컨트롤러" {
    	        viewController.name = "전달 데이터"
        }
    }
}

하위

// 하위 ViewController

class SuguePushViewController: UIViewController {
    @IBOutlet weak var nameLabel: UILabel!
    
    // 상위에서 받아올 변수
    var name: String?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        if let name = name {
        	// 받아온 변수를 label의 내용으로
            self.nameLabel.text = name
        }
        
    }
    @IBAction func tapBackButton(_ sender: UIButton) {
	    // 이전 화면으로 이동
        self.navigationController?.popViewController(animated: true) 
    }

}
반응형