본문 바로가기

iOS 앱 개발자 프로젝트/iOS 입문

[iOS] Closure를 활용한 VC 통신 (feat. prepare method)

수업에서 배운 아래의 기능 구현을 복습하며 prepare 메소드와 closure 사용에 익숙해져 봅니다.

 

  • A, B 2개의 화면이 있고, A → B 로 이동하는 플로우를 가지고 있음
  • B 화면에는 +/- 스테퍼 기능 있음
  • B 화면에서 증가시키면 A 화면의 숫자가 반영됨

 

 

새로운 파일로 firstViewController 와 secondViewController 를 추가해 각각 커스텀 클래스 명칭을 지정하고,

초기화면은 firstViewController로 설정한다.

 

아래 이미지와 같이 firstViewController에는 Label과 Button으로 0과 다음화면을 만들고,

Label 0은 IBOutlet을 사용해 numberLabel로 선언하여 firstViewController와 연결해 주었다.

 

secondViewController 에는 Button(+)을 만들고 IBAction으로 didTap func를 만든 후, plusHandler라는 변수를 저장하여 호출해 주었다.

 

 

 

secondViewController에서 저장한 plusHandler 는 옵셔널로 아래와 같이 ()로 wrapping하고 ?를 붙여주었다.

import UIKit

class SecondViewController: UIViewController {
    
    var plustHandler: (() -> ())?
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    

    @IBAction func didTap(_ sender: Any) {
        
        plustHandler?()
    }

 

 

그리고 아래 코드와 같이 prepare(for:sender:)를 사용하여 두 컨트롤러를 연결해 주었다. segue.destination은 화면 전환의 목적지가 되는 secondViewController를 나타내는데 secondVC에 할당해 주었다. 그런 다음 secondVC의 plusHandler 클로저를 설정했다. 이 클로저는 numberLabel의 숫자를 1 증가시킨다. plusHandler 클로저는 numberLabel 텍스트를 정수로 변환하여 1을 더한 후, 다시 문자열로 변환하여 numberLabel에 할당한다. 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
       let secondVC = segue.destination as? SecondViewController
        
        secondVC?.plustHandler = {
            guard let numberStr = self.numberLabel.text,
                    let number = Int(numberStr)
            else {return}
            
            self.numberLabel.text = "\(number + 1)"

 

 

※ closure 내에서는 self를 가져다 쓸 수 없기 때문에 써줘야 한다. self를 안넣어주면 아래와 같은 에러 메시지가 뜬다.

 


 

최종 build된 모습은 아래와 같다.

 

(트랙볼 마우스가 아직 적응이 안되서 .. 커서를 버벅거리며 ... ^^;)