티스토리 뷰
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)
이번 글에서 사용된 코드는 여기에서 보실 수 있습니다!
(깃헙을 추가할 수 있도록 피드백 주신 종국님께 감사드립니다🙂)
'Swift' 카테고리의 다른 글
RxSwift로 UITextField 글자 수 제한하기 (0) | 2021.01.24 |
---|---|
코르도바 iOS 플러그인 만들기 (Swift, Framework 사용법) (2) | 2021.01.04 |
loadView()에 대한 간단한 고찰 (5) | 2020.11.20 |
[Swift] Xib, Storyboard의 ViewController를 불러오는 방법 (2) | 2020.11.12 |
The resource could not be loaded because the App Transport Security policy requires the use of a secure connection (0) | 2020.09.25 |
- Total
- Today
- Yesterday
- Swift 프로젝트에서 Objective-C
- swift delegate
- UITextField 글자수 제한하기
- 코르도바 iOS
- urlrequest 모듈화
- linux java 설치
- Viewcontroller data
- xcode group folder
- codable date
- codable
- ios universal framework
- Objective-C 프로젝트에서 Swift
- passing data between ViewControllers
- xcode 16
- UIUserInterfaceStyle
- swift generic
- 코르도바 iOS Framework
- passing data between ViewController and View
- loadView viewDidLoad
- urlsession 공통화
- ios framework device simulator
- iOS Dark Mode
- 코르도바 Swift
- User Interface Style
- urlsession 모듈화
- 코르도바 플러그인
- RxSwift UITetxtField
- urlrequest 공통화
- loadView
- swift json 파싱
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |