[iOS] 화면간 데이터 전달 방식

Data Deliver iOS Sample

Posted by JungHoon-Park on May 20, 2019

Sample : iOS Data Deliver


SampleDataDeliver_ios

1. 뷰 컨트롤러에 직접값을 전달하기

  • 전달할 값을 준비

  • 값을 전달받을 프로퍼티 정의

  • 값을 전달받을 viewcontroller의 인스턴스를 직접 생성하거나, 이미 생성되어 있는 인스턴스의 참조를 읽어옴.

  • 정의한 프로퍼티에 값을 대입 후 화면 전환.

2. 이전 화면으로 값을 전달하기

  • 전달받는 viewcontroller의 인스턴스를 생성하는 것이 아니라 현재 존재하는 viewcontroller의 인스턴스의 참조값을 얻어온다.

  • 인스턴스가 초기화 될때 마다 호출되는 viewDidLoad() 메소드를 사용하지않고, 화면이 새롭게 그려질 때마다 호출되는 viewWillAppear() 메소드사용

소스코드

1_1. 전달할 값을 준비

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@IBOutlet weak var interval: UIStepper!
@IBOutlet weak var email: UITextField!
@IBOutlet weak var isUpdate: UISwitch!
@IBOutlet weak var intervalText: UILabel!
@IBOutlet weak var isUpdateText: UILabel!
override func viewDidLoad() {
    super.viewDidLoad()
}
@IBAction func onSwitch(_ sender: UISwitch) {
    if(sender.isOn == true){
        self.isUpdateText.text = "갱신함"
    }else{
        self.isUpdateText.text = "갱신하지 않음"
    }
}
    
@IBAction func onStepper(_ sender: UIStepper) {
    let value = Int(sender.value)
    self.intervalText.text = "\(value)분 마다"
}

1_2. 값을 전달받을 프로퍼티 정의

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class SecondViewController : UIViewController{
    
@IBOutlet weak var resultInterval: UILabel!
@IBOutlet weak var resultUpdate: UILabel!
@IBOutlet weak var resultEmail: UILabel!
    
var paramInterval: Double = 0
var paramUpdate: Bool = false
var paramEmail: String = ""
    
override func viewDidLoad() {
    super.viewDidLoad()
    self.resultEmail.text = paramEmail
    self.resultUpdate.text = (self.paramUpdate == true ? "자동갱신" : "자동갱신안함")
    self.resultInterval.text = "\(Int(paramInterval))분 마다 갱신"
}

1_3. 값을 전달받을 viewcontroller의 인스턴스를 직접 생성하거나, 이미 생성되어 있는 인스턴스의 참조를 읽어옴

1
2
3
4
5
@IBAction func onSubmit(_ sender: Any) {
    guard let resultView = self.storyboard?.instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController else{
            return
    }
}

1_4. 정의한 프로퍼티에 값을 대입 후 화면 전환

1
2
3
4
5
6
7
8
9
10
@IBAction func onSubmit(_ sender: Any) {
    guard let resultView = self.storyboard?.instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController else{
        return
    }
    resultView.paramEmail = self.email.text!
    resultView.paramUpdate = self.isUpdate.isOn
    resultView.paramInterval = self.interval.value
        
    self.present(resultView,animated: true)
}

1_5. segue 로 화면 전환할때

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//manual segue
@IBAction func onPerformSegue(_ sender: Any) {
    self.performSegue(withIdentifier: "ManualSubmit", sender: self)
}
    
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let destinationview = segue.destination
        
    guard let resultViewController = destinationview as? NaviResultViewController else{
        return
    }
        
    resultViewController.paramEmail = self.emailText.text!
    resultViewController.paramUpdate = self.switchbtn.isOn
    resultViewController.paramInterval = self.interval.value
}

2_1. 전달받는 viewcontroller의 인스턴스를 생성하는 것이 아니라 현재 존재하는 viewcontroller의 인스턴스의 참조값을 얻어온다.

1
2
3
4
5
6
7
8
9
10
11
12
@IBAction func secondSubmitBtn(_ sender: Any) {
    let valuebackfirst = self.presentingViewController
    guard let previewcontroller = valuebackfirst as? ValuebackFirst else{
        return
    }
        
    previewcontroller.paramEmail = self.inputEmail.text
    previewcontroller.paramInterval = self.secondStepper.value
    previewcontroller.paramUpdate = self.secondSwitch.isOn
        
    self.presentingViewController?.dismiss(animated: true, completion: nil)
}

2_2. 인스턴스가 초기화 될때 마다 호출되는 viewDidLoad() 메소드를 사용하지않고, 화면이 새롭게 그려질 때마다 호출되는 viewWillAppear() 메소드사용

1
2
3
4
5
6
7
8
9
10
11
override func viewWillAppear(_ animated: Bool) {
    if let email = paramEmail{
        resultEmail.text = email
    }
    if let update = paramUpdate{
        resultUpdate.text = update==true ? "자동갱신" : "자동갱신안함"
    }
    if let interval = paramInterval{
        resultInterval.text = "\(Int(interval))분마다 갱신"
    }
}

소스코드링크(github)