일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- String
- Terminal
- 디자인패턴
- UIKit
- IOS
- 코딩테스트
- interpace
- property
- type
- Method
- Protocol
- enum
- Class
- url
- initalizer
- init
- Git
- Swift
- delegate
- extension
- Unicode
- instance
- 스위프트
- initializer
- Xcode
- tuist
- 이니셜라이저
- struct
- Foundation
- optional
Archives
- Today
- Total
아리의 iOS 탐구생활
[iOS/UIKit] prepare method 알아보기 본문
반응형
새로운 ViewController 클래스를 만들게 되면 아래 prepare 메소드가 주석처리 되어있다.
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
}
*/
In a storyboard-based application, you will often want to do a little preparation before navigation.
스토리보드 기반의 어플리케이션에서, 당신은 네비게이션 전에 약간의 준비를 하는 것이 좋을 것이다.
읽어보면 다른 ViewController로 전환하기 전에 그 ViewController로 데이터들을 보낸다고 생각할 수 있겠다.
# 예제를 보면서 이해하기
A View Controller의 TextField에 입력한 내용을 prepare 메소드를 이용하여 B에 전달하고 B View Controller의 Label에 반영시켜보자.
- 먼저 A View에 UITextField와 UIButton을 추가해주고, @IBOutlet을 연결해준다. 이후 B View에는 UILabel을 추가해주고, 마찬가지로 @IBOutlet을 연결시켜준다.
- 그리고 A View에서 prepare 메소드에서 segue.destination를 B View Controller 타입으로 다운 캐스팅을 할 수 있을 때 입력받은 text를 B View Controller의 receivedText로 보내준다.
// A View Controller 클래스 내부에 구현
@IBOutlet weak var textField: UITextField!
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let nextViewController = segue.destination as? ViewControllerB else {
return
}
nextViewController.receivedText = textField.text
textField.text = ""
}
- B View Controller에서는 ViewController로 부터 받은 text를 저장해 둘 receivedText 변수를 선언하고, View가 보여지기 전 호출 되는 viewWillAppear 메소드에서 receivedText를 Label에 넣어준다.
// B View Controller 클래스 내부에 구현
var receivedText: String?
@IBOutlet weak var textLabel: UILabel!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
textLabel.text = receivedText
}
# 결과
# 주의해야할 점
nextViewController.textLabel.text = textField.text
- 위 예제에서는 receivedText라는 변수를 따로 선언하여 textLabel.text에 전달해주었는데, 그냥 위 코드처럼 바로 넣어주는게 간단하지 않을까? 라는 의문이 들 수도 있다.
그래서 디버깅 창에서 nextViewController(B View Controller)가 메모리에 있는지 보여달라고 디버깅 명령어(po nextViewController)를 적어보면 해당 인스턴스의 메모리 주소가 찍힌다.
하지만 nextViewController.textLabel이 메모리에 있는지 보여달라고 명령어를 다시 쳐본다면 nil이 찍히는 것을 볼 수 있다.
# 정리
보통 외부로부터 데이터를 받을 때는 View와 관련된 프로퍼티에 직접 받지 않고 외부로부터 받을 데이터를 저장하는 프로퍼티를 따로 선언하여 할당받는다.
Reference
반응형
'Swift > iOS' 카테고리의 다른 글
[iOS/UIKit] init(frame:)와 init(coder:) (0) | 2021.12.01 |
---|---|
[iOS/Swift] TDD와 Unit Test (0) | 2021.11.23 |
[iOS/UIKit] UIStepper Tutorial (0) | 2021.10.27 |
[iOS/UIKit] ViewController의 Life cycle (0) | 2021.10.22 |
[iOS/UIKit] Navigation Controller 맛보기 (0) | 2021.10.22 |
Comments