1. 뷰 컨트롤러간 직접 전달

  • 코드상에서 뷰 컨트롤러간 직접 데이터를 주고 받을 때에는 화면 전환 메소드에 캐스팅만 추가하면 된다.
  • 스토리보드를 통한 화면 전환이 이루어질 경우 prepare 메소드를 통해 데이터를 전달한다.
  • 화면 전환을 전제로 하는 이유는 화면 전환 없이 데이터만 전달하는 경우는 보통 무의미하기 때문이다. (전달한 데이터 혹은 전달받은 데이터를 사용하지 않으므로)

1-1. 코드상으로 화면 전환을 하는 경우

@IBAction func send(_ sender: UIButton) {
        guard let vc2 = self.storyboard?.instantiateViewController(withIdentifier: "VC2") as? VC2 else { return }
        
        //데이터 전달
        
        //뷰 인스턴스 띄우기(present or push)
    }
  • 앞서 말했듯 화면 전환 메소드와 동일하지만 as? VC2 구문이 추가되었다.
  • VC2로 캐스팅하는 이유는 instantiateViewController 를 통해 생성된 인스턴스는 UIViewController 이기 때문에 VC2.swift에 정의된 프로퍼티에 접근할 수 없기 때문이다.
  • 그렇기 때문에 UIViewController를 상속받은 VC2로의 다운캐스팅을 통해 VC2가 가진 프로퍼티에 접근하여 데이터를 전달해야 한다.

1-2. 스토리보드상으로 화면 전환을 하는 경우

  • 스토리보드상으로 화면 전환을 하는 경우 세그웨이를 이용한다.
  • 세그웨이가 실행되기전 항상 실행되는 prepare 메소드를 통해 데이터를 전달할 수 있다.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        guard let vc2 = segue.destination as? VC2 else { return }
        
        //데이터 전달
    }
  • 위의 prepare 메소드는 실행 시점을 우리가 정해주지 않아도 된다.
  • 작성만 되어있다면 세그웨이 실행과 함께 자동으로 실행된다.

2. UserDefaults를 이용한 전달

  • UserDefaults에 데이터 저장
@IBAction func send(_ sender: UIButton) {
        UserDefaults.standard.set(<Value>, forKey: <String>)
    }
  • UserDefaults에서 데이터 가져오기
UserDefaults.standard.value(forKey: <String>)
  • 데이터를 가져올때는 저장된 값의 타입에 맞는 메소드를 사용하면 바로 사용이 가능하다.