💡 Pass Data between View Controllers
- property
- notification
- delegate pattern
- closure
🔎 property
데이터를 넘길 뷰의 프로퍼티에 직접 값을 전달하는 방식이다.
push나 present 방식의 화면 전환에서만 사용할 수 있다.
❗️ 전환된 화면에서 다시 돌아갈 때 값을 전달하고 싶다면 다시 돌아갈 뷰컨에 전달해야 하는데 잘 사용하지도 않으며 뷰컨 관계가 상호적으로 묶이게 되는 문제가 발생한다.
때문에 역방향으로 값을 전달하고 싶을 땐 다음 세가지 방법을 사용해보자
🔎 Notification
A → B → C ⇒ C에서 변경한 데이터 A, B에 반영
post → signal ( signal name)
“Name”이라는 signal을 addObserver
✅ 신호 보내기 NotificationCenter.default.post()
name, sample 값을 SelectImage라는 이름을 가진 신호를 통해 post
userInfo 매개변수로 원하는 데이터를 보내준다.
✅ 보낸 신호 받기 addObserver
addObserver는 신호만 받고 받은 신호에 대한 데이터 처리는 별도로 구현해야 한다.
addObserver를 통해 name신호로 데이터를 받아 selector 메서드에 해당 데이터에 대한 처리를 구현
✅ 받은 신호에서 userInfo 꺼내오기
userinfo의 키 값이 없을 수 있기 때문에 옵셔널 처리를 해야한다.
userInfo로 넘어온 값의 데이터 타입은 Any이다.
때문에 받은 데이터 타입은 알 수 없다.
때문에 값을 전달 받았다면 타입캐스팅을 해줘야 한다!
If let 구문을 통해 타입캐스팅
Notification.Name에 오타가 나면 신호를 받을 수 없다. 휴먼에러를 방지하기 위해 Extension을 사용해보자
🚨 Notification을 이용한 정방향 값 전달
addObserver는 미리 등록이 되어 있어야 신호를 받을 수 있다. 하지만 정방향 전달은 계층 구조 상 observer 등록 이전에 post를 하게 된다. Observer가 등록되기 전에 Post가 된다면 신호를 못받는다.
➡️ 때문에 Notification은 정방향 전환에서는 사용하지 않고 역방향 전환 시 주로 사용한다.
post의 순서와 addObserver의 순서가 중요함!
🚨 addObserver의 중복
addObserver를 viewWillAppear에 등록 시 화면이 나타날 때 마다 Observer가 등록되어 호출되는 횟수가 증가한다.
→ addObserver는 한 번만 등록되도록 배치해야 한다.
viewDidLoad()에 등록하는 것이 좋다.
중복 노티 방지를 체크해야 함!
✅ removeObserver
뷰가 사라질 때 removeObserver메서드를 호출하여 observer를 제거한다.
중복해서 observer가 등록되는 것을 방지할 수 있고, 필요할 때만 Notification 기능을 사용할 수 있게 된다.
🔎 Delegate 값 전달
- protocol 구현
- delegate
- 전달할 값 매개변수로 넣기
- 전달 받은 값
프로토콜 채택하여 프로토콜을 통해 전달 받은 값을 처리한다.
- 화면 전환 시 값 전달
delegate를 연결하여 값을 전달한다.
🔎 closure 값 전달
- 옵셔널로 클로저 선언
→ 데이터를 보낼 쪽
- 함수를 호출하여 값을 전달
→ 데이터를 보낼 쪽
- 클로저를 통해 값을 받아 기능을 구현
→ 데이터를 받을 쪽
❓ 여러 데이터를 전달하고 싶다면?
'iOS > 🔎 swift 정리하기' 카테고리의 다른 글
[iOS/Swift] MapKit - 원하는 곳에 어노테이션을 찍어보자 (0) | 2023.10.01 |
---|---|
[iOS/Swift] Realm - 백업 및 복구 구현하기 (0) | 2023.09.16 |
[iOS/Swift] Realm - Migration (0) | 2023.09.16 |
[iOS/Swift] Realm - 이미지 파일 저장하기 (0) | 2023.09.16 |
[iOS/Swift] Realm - CRUD (0) | 2023.09.16 |