본문 바로가기
Developer/iOS, Swift

[Swift] ViewController 간 화면 전환 및 데이터 주고받기 (Programmatically)

by Doony 2019. 11. 10.

지난번에 ViewController간 뷰와 데이터를 이동하는 방법 중 segue를 이용하는 것에 대해 포스팅했었는데요.

오늘은 스토리보드에서 각 뷰의 id값만 지정하고, 그 외 모든 것을 programmatically 하게 하는 방식에 대해 알아보겠습니다.

현업 개발자가 아니라 실제 협업 시 어떤 방식이 더 많이 쓰이는 지는 잘 모르겠습니다만, 개인적으로는 후자의 방식이 더 편리한 것 같았습니다.

작업 순서

  • 스토리보드에서 2개의 뷰 생성 후 ID값 부여
  • 각각의 뷰에 버튼과 레이블 생성 (데이터 이동 확인용)
  • 초기 뷰에서 코딩

먼저, 아래 그림과 같이 스토리보드에서 2개의 뷰컨트롤러를 각각 생성하고 id값에 원하는 값을 지정합니다.

동작 방식은 이렇습니다.

초기 뷰에서 버튼을 누르면, 다음 뷰로 넘어가고, 다음 뷰의 레이블에 초기뷰의 버튼 텍스트가 입혀집니다. 두번째 뷰의 버튼을 누르면 두번째 뷰가 닫히면서 초기 뷰로 돌아갑니다.

각 뷰의 스위프트 파일을 보시면 다음과 같습니다.

FirstViewController

class FirstViewController: UIViewController {
  @IBOutlet var btnFirst: UIButton!

  override func viewDidLoad() {
      super.viewDidLoad()

  }

  @IBAction func btnFirstClicked(_ sender: UIButton) {
      let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
      let vc = storyBoard.instantiateViewController(withIdentifier: "secondVC") as! SecondViewController
      vc.dataReceived = btnFirst.currentTitle
      self.present(vc, animated: true, completion: nil)
  }
}

SecondViewController.swift

class eraseViewController: UIViewController {

    @IBOutlet var btnSecond: UIButton!
    @IBOutlet var lblSecond: UILabel!

    var dataReceived: String = ""

    override func viewDidLoad() {
        super.viewDidLoad()
        lblSecond.text = dataReceived
    }

    @IBAction func btnSecondClicked(_ sender: UIButton) {
        dismiss(animated: true, completion: nil)
    }
}

위와 같이 작업 시, 스토리보드에서 별도의 show 설정 없이도 뷰 간 이동 및 데이터 이동이 되는 것을 볼 수 있습니다.
제 느낌으로는 훨씬 더 직관적이고, 또 안드로이드의 intent와도 유사한 방식으로 작동하는 것 같아 더 익숙하다는 느낌이 들었습니다.

또 이렇게 하는 방식은 프로토콜로 데이터를 주고받을 때도 매우 편리한데요. 일석이조의 느낌같다고나 할까요?

다음에는 이러한 상황에서, protocoldelegate를 이용해서 데이터를 주고 받는 방법에 대해 포스팅해보겠습니다.

댓글