iOS/UIKit

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

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

화면은 서로 데이터를 주고 받을 수 있어야 합니다.

원래 뷰 컨트롤러 -> 이동할 뷰 컨트롤러를 '상위' -> '하위'로 표현하겠습니다.

 

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

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

1. Code를 이용할 때

2. Sugue를 이용할 때

 

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

Present를 예로 들었지만 Push도 동일하게 사용할 수 있습니다.

 

하위 뷰에서 상위 뷰로 데이터를 전달할 때는 delegate 패턴이라는 것을 사용합니다.

1. 상위 뷰에 프로토콜 선언(원하는 기능을 넣으면 되는데 여기서는 기본 데이터 전달을 하겠습니다.)

2. 하위 뷰에 원하는 함수 정의

3. 하위 뷰의 프로퍼티에 자기 자신을 전달하기()

 

protocol을 이용하는데 이는 어디에 선언해 주어도 괜찮지만 저는 상위 뷰에 선언하겠습니다.

// 상위 ViewController

// delegate 패턴 사용을 위한 protocol
protocol SendDelegate: AnyObject {
    func send(name: String)
}

class ViewController: UIViewController, SendDataDelegate {
	@IBOutlet weak var nameLabel: UILabel!
	@IBAction func tapCodePresentButton(_ sender: UIButton) {
        // 스토리보드에서 이름 붙이고 이름을 가져옴
        guard let viewController = self.storyboard?
        .instantiateViewController
        (withIdentifier: "이동할 뷰 컨트롤러") as?
        "이동할 뷰 컨트롤러" else{return}
        
        // 전체 화면으로
        viewController.modalPresentationStyle = .fullScreen
        
        // delegate로 하위 뷰에 자기 자신 전달 알려줌
        viewController.delegate = self
        
        // present 시키기
        self.present(viewController, animated: true, completion: nil)
    }


	// 뷰 클래스 내부에는 함수를 정의
	// 데이터를 가져오기 위해 send 선언
    func sendData(name: String) {
        self.nameLabel.text = name
    }
}

 

하위에서 delegate로 전달된 send를 사용해 보겠습니다.

// 하위 ViewController

class CodePresentViewController: UIViewController {
    @IBOutlet weak var nameLabel: UILabel!
    var name: String?
    
    // 상위에서 delegate로 자신을 받아와 저장할 변수
    // delegate는 메모리 누수 때문에 weak 붙여야 함!
    weak var delegate: SendDataDelegate?
   
    // 다시 상위 뷰로 돌아가는 Action을 할때 데이터 전달하기
    @IBAction func back(_ sender: UIButton) {
    	
        // 여기서 delegate의 send 사용
        self.delegate?.sendData(name: "상위로 전달할 데이터")
        // dismiss로 돌아가기
        self.presentingViewController?.dismiss(animated: true, completion: nil)
    }
}
반응형