아리의 iOS 탐구생활

[iOS/UIKit] prepare method 알아보기 본문

Swift/iOS

[iOS/UIKit] prepare method 알아보기

Ari Lee 2021. 10. 28. 17:48
반응형

 

 

Apple Developer Documentation

 

developer.apple.com

 

새로운 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 Controller, B View Controller Setting

 

  • 그리고 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

 

[iOS] prepare 메소드란?

지난번 segue 연결 포스팅에서 performSegue(withIdentifier: sender:) 메소드가 불리기 전에 prepare(for segue: sender:) 메소드가 먼저 호출된다는 부분이 있었다. 이부분에 대해 정확히 알아보고, 주의해야할..

jiyeonlab.tistory.com

 

 
 
 
 
 
 
 
 
반응형

'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