WooKoo Blog

물과 같이

개발/개발

[iOS] - 뷰컨트롤러 간 값 전달/직접전달방식(동기방식)

WooKoo 2020. 1. 10. 16:18

뷰 컨트롤러 간 데이터를 공유하는 방식에 대해서 알아보자.

 

크게 두가지 방식이 있는데 미리 만들어둔 변수를 이용하여 직접 값을 전달하는

 

1. 직접 전달  방식(동기방식)

 

공유소나 저장소에 저장하여 필요할 때 꺼내오고 저장하는 

 

2. 간접 전달 방식(비동기 방식)

 

이 있다. 

 

1의 방법의 경우 받는 뷰 컨트롤러에서 받아야할 데이터들의 명세를 미리 정의해주어야하고

2의 방법의 경우 저장소 위치를 공유하고 있어야한다.

 

오늘은 1번의 방법을 통해서 데이터를 주고 받는 과정을 알아볼 것이다.


먼저 사진과 같이 1VC를 만들어 준다. 

 

위에서 부터 텍스트 필드, 스위치, 스테퍼, 버튼이다.

이후 2VC도 만들어주며 버튼을 제외한 나머지는 다 Label들이며 화면 전환 시  데이터들에 따라 값이 변경 될 예정이다.

 

먼저

1. VC1의 텍스트 필드와 스위치, 스테퍼들을 아울렛 변수를 설정해준다.

2. 스위치와 스테퍼의 옆 Label또한 아울렛 변수를 설정해준다.

3. 스위치와 스테퍼의 액션 메소드를 만들어준다 *이 때 타입을 Any타입이 아니라 UI***타입으로 선언

(왜냐하면 각자의 속성값을 제어해야할 때 이렇게 해주어야한다. 이외에는 모두 Any를 사용)

 

그 후 아래와 같이 코드를 작성합니다.

    @IBAction func onSwitch(_ sender: UISwitch) {
        if (sender.isOn == true){
            self.updateText.text = "갱신"
        }else{
            self.updateText.text = "갱신하지 않음"
        }
    }

 

변수명은 각자 정한대로 바꿔서 사용합시다!

 

여기서 isOn 속성은 스위치의 값을 Bool값으로 반환해준다.

 

다음은 스테퍼의 메소드

  @IBAction func onStepper(_ sender: UIStepper) {
        let value = Int(sender.value)
        self.intervalText.text = "\(value)마다."
    }

저 이제 실행해서 스위치와 스테퍼의 액션메소드를 누를 때 마다 레이블이 바뀌는지 확인 후 다음 과정으로 넘어갑시다.

 

이제 VC2에 넘어가서 대입할 프로퍼티를 정의해줍시다.

 

1. Label 아울렛 변수를 정의해줍시다.

    @IBOutlet weak var resultTF: UILabel!
    @IBOutlet weak var resultSwit: UILabel!
    @IBOutlet weak var resultStepper: UILabel!

 

2. 변수들을 정의해줍시다.

    var paramTF: String = ""
    var paramSwit: Bool = false
    var paramStepper: Double = 0

 

자 이제 뷰가 처음 생겼을 때의 메소드인 viewDidLoad()메소드에 아래와 같이 Label의 변수에 대입해줍시다.

    override func viewDidLoad() {
        super.viewDidLoad()
        self.resultTF.text = paramTF
        self.resultSwit.text = (self.paramSwit == true ? "자동갱신" : "자동갱신안함")
        self.resultStepper.text = "\(Int(paramStepper)) 마다 갱신"
    }

 

자 이제 다시 VC1으로 돌아와서 화면 전환 버튼을 누르면 전환하기 직전에 변수를 넘겨주도록 할건데 그 전에 vc2의 인스턴스를 생성해줍니다.

    @IBAction func submitButton(_ sender: Any) {
        guard let vc2 = self.storyboard?.instantiateViewController(withIdentifier: "VC2") as? SecondVC else{
            return
        }
        
        vc2.paramTF = self.tf.text!
        vc2.paramSwit = self.swc.isOn
        vc2.paramStepper = self.sp.value
        
        self.present(vc2, animated: true)
        
    }
}

그 후 코드와 같이 변수를 vc2의 변수들에 대입하고 화면전환을 해주면 vc2에서도 vc1에서 입력한 값과 같은 값을 볼 수 있다.

 

마지막으로 백버튼은 이전 화면 전환 포스팅에서 볼 수 있듯

    @IBAction func backButton(_ sender: Any) {
        self.presentingViewController?.dismiss(animated: true)
    }

프레젠팅 뷰컨트롤러에 dismiss를 요청하자!!


설명이 대충되어있지만 기본적인 흐름을 안다면 쉽게 글이 읽힐 것이고 모른다면 예제 프로젝트를 통해 알아보도록 하자.

https://github.com/2jae6/Swift-Example/tree/master/SendValue

 

2jae6/Swift-Example

Contribute to 2jae6/Swift-Example development by creating an account on GitHub.

github.com

예제 프로젝트 주소