수업에서 배운 아래의 기능 구현을 복습하며 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된 모습은 아래와 같다.
(트랙볼 마우스가 아직 적응이 안되서 .. 커서를 버벅거리며 ... ^^;)
'iOS 앱 개발자 프로젝트 > iOS 입문' 카테고리의 다른 글
[iOS] JSON (JavaScript Object Notation) (0) | 2024.04.09 |
---|---|
[iOS] ViewController - Lifecycle Method (0) | 2024.04.02 |
[iOS] 간단한 카운트 화면 만들기 (0) | 2024.03.24 |
[iOS] LifeCycle - App, ViewController, AppDelegate (2) | 2024.03.22 |
[iOS] 메모 앱 만들기 Day-3 (0) | 2024.03.22 |