티스토리 뷰

Swift

ViewController끼리 Data 전달하기 - 1

hyeonii_12 2020. 11. 25. 18:52

ViewController끼리 Data 전달하기 - 1

Swift Version 5.3
Xcode Version 12.1

두 개의 ViewController 화면 사이에서 데이터를 주고 받아야 할 때가 있습니다.
데이터를 주고 받는 방법은 굉장히 많지만, 그 중에서도 제가 가장 자주 이용하는 방법들을 소개해드리고자 합니다.

1. Instance Property 이용하기

단순한 데이터만 주고받을 때 주로 이용하는 방법입니다.

예를 들어 카카오톡의 채팅 목록에서 홍길동이라는 사람과의 채팅 목록을 선택했을 때 홍길동과의 채팅 내역들을 불러오기 위해서 그 사람의 이름을 전달하는 경우를 이야기 합니다. (물론 실제로는 이름이 아닌 키 값을 전달해서 네트워크 통신을 진행하겠지만요)

첫 번째 뷰 컨트롤러를 FirstVC, 두 번째 뷰 컨트롤러를 SecondVC라고 하고 첫 번째 뷰 컨트롤러에서 버튼을 눌렀을 때 두 번째 뷰 컨트롤러에서 전달받은 데이터를 프린트 해 보도록 하겠습니다.

SecondVC 설정

1
2
3
4
5
6
7
8
9
class SecondViewController: UIViewController {
  var data: String?
  
  override func viewDidLoad() {
    super.viewDidLoad()
    
    print("data: \(data)")
  }
}
cs

우선 SecondVC에서 데이터를 전달 받을 객체를 선언해야 합니다. 저는 data라는 이름의 프로퍼티를 만들었고, 데이터를 넣어야 하니 var로 선언했습니다.

그리고 화면이 로드되면, 넘어온 데이터를 프린트 하도록 했습니다.

FirstVC 설정

1
2
3
4
5
6
// 버튼 클릭 시 selector 함수
@objc func handleNextVC() {
  let secondVC = SecondViewController()
  secondVC.data = "Hi"
  self.present(secondVC, animated: false, competion: nil)
}
cs

FirstVC에서는 데이터를 넘겨주기만 하면 됩니다.

참 쉽죠?

저는 스토리보드를 만들지 않고 단순 코드로만 뷰 컨트롤러를 구성하기 때문에 SecondViewController를 Initialize 할 때 파라미터가 없는 SecondViewController(), SecondViewController.init() 생성자를 사용하고 있습니다.

Xib 혹은 스토리보드를 이용해서 뷰 컨트롤러를 구성하신 분이라면 이전 글을 참고해주세요.

2020/11/12 - [Swift] - [Swift] Xib, Storyboard의 ViewController를 불러오는 방법

 

2. Initialize Parameter 이용하기

사실 저는 1번 방법은 자주 쓰지 않습니다. 넘겨줘야할 데이터가 한 개가 아니라 그 이상일 경우, 데이터를 빼먹을 수도 있고 일일이 파라미터 이름을 검색해서 넘겨줘야 하기 때문입니다.

1
2
3
4
5
6
7
8
// 버튼 클릭 시 selector 함수
@objc func handleNextVC() {
  let secondVC = SecondViewController()
  secondVC.name = "Hyeon"
  secondVC.age = 0
  secondVC.gender = "Female"
  self.present(secondVC, animated: false, competion: nil)
}
cs

이런식으로 말이죠.

그래서 저는 두 번째 뷰 컨트롤러를 생성할 때 파라미터로 해당 프로퍼티들을 같이 넘겨받는 방법을 사용하고 있습니다.

SecondVC 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class SecondViewController: UIViewController {
    var name: String?
    var age: Int?
    var gender: String?
 
    init(name: String?, age: Int?, gender: String?) {
        super.init(nibName: nil, bundle: nil)
        self.name = name
        self.age = age
        self.gender = gender
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        print("name: \(name), age: \(age), gender: \(gender)")
    }
}
cs

SecondVC에서 데이터를 전달 받을 객체를 선언하는 부분까지는 동일합니다.
그러나 아까와는 달리 init이라는 해당 클래스를 생성하는 생성자를 통해 주어진 인스턴스들을 모두 초기화하고 있습니다.

FirstVC 설정

 
1
2
3
4
5
// 버튼 클릭 시 selector 함수
@objc func handleNextVC() {
  let secondVC = SecondViewController(name: "Hyeon", age: 0, gender: "Female")
  self.present(secondVC, animated: false, competion: nil)
}
cs

보이시나요!

SecondViewController에서 생성자 함수를 잘 정의했다면, FirstViewController에서 자동으로 해당 생성자가 보일겁니다!
(자동완성을 보는 방법은 Esc 버튼을 통해서 확인하실 수 있습니다.)

3. Delegate Pattern 활용하기

네.. 사실 이번 글을 쓰는 목적이 바로 이것이었습니다..!

제가 이 델리게이트 패턴을 이해하는 데에 꽤나 긴 시간이 걸렸습니다.. 사실 뷰컨트롤러 사이에서 데이터를 주고받으려면 2번의 방법도 저는 깔끔하고 좋았는데요, 뷰컨트롤러와 뷰 사이에서 데이터를 주고 받는다던가 하는 부분에서 사용하기 위해서는 델리게이트 패턴에 대한 이해가 필수적이었죠.

하지만 델리게이트 패턴은 글이 좀 길어질 것 같으니 다음 편에서 설명하도록 하겠습니다!

2021/02/07 - [Swift] - Delegate Pattern 활용하기 (ViewController끼리 Data 전달하기 - 2)

 

Delegate Pattern 활용하기 (ViewController끼리 Data 전달하기 - 2)

Delegate Pattern 활용하기 (ViewController끼리 Data 전달하기 - 2) Swift Version 5.3 Xcode Version 12.3 드디어.. 마음의 짐으로 남아있던 이 Delegate Pattern에 대해 설명을 하려고 합니다. 이전 글은 아래..

learn-hyeoni.tistory.com

 

이번 글에서 사용된 코드는 여기에서 보실 수 있습니다!
(깃헙을 추가할 수 있도록 피드백 주신 종국님께 감사드립니다🙂)

댓글