본문 바로가기
🌱

값전달 - 클로저 트러블 슈팅

by 방우 2022. 8. 19.

코드구현 의도(VC1 -> VC2)

사용자가 특정 영화의 클립을 선택하면 웹뷰컨(VC2)에서 flag로 bool값을 받아 서치뷰컨(VC1)의 클립버튼의 배경색을 바꾸려고함

(유저디폴트로 하면되지만 값전달로 유저디폴드를 연습삼아 전달해봄)

문제상황

기존의 생각

  • VC1의 클립을 클릭하면 → 클로저의 기능이 전달되고 → 그 값을 토대로 VC2의 클래스의 bool타입 프로퍼티인 flag에 bool값을 넣어주고 → VC2의 clikedClip함수가 실행되어 얼럿이 띄워지고 → 얼럿의 액션버튼을 누르면 전달된 클로저 기능 코드를 호출하게 되고 → 다시 VC1에 값전달되는 줄 알았다.

문제상황

  • 하지만 얼럿의 액션버튼을 클릭하면 배경색을 바꾸는 클로저 내부의 코드에 breakpoint가 걸려야하는데(아래 사진 참조), 계속 안 걸림 . 얼럿 액션버튼을 눌렀을 때 flag의 바뀐 bool값의 프린트는 잘됨

해결

  • 네비게이션 이해의 부족 (난 present로 구현)
  • 예를 들어 버튼을 총 4개 만들었다치면 (VC1 → VC2)
    • 전환화면(VC1)
      • 화면전환 없는 값전달코드가 있는 버튼 (가)
      • 화면전환만 되는 코드가 있는 버튼 (나)
    • 전환된 화면(VC2)
      • 이전화면으로 돌아가는 코드만 있는 버튼 (다)
      • 클로저만 실행시키는 코드가 있는 버튼 (라)

내가 기존에 생각한 대로 되려면?

 

가 버튼을 누르고 나 버튼을 누르면 클로저가 전달돼야한다.

 

하지만 VC2에서 함수를 실행하는 버튼메서트 내부에 클로저를 프린트해보니 nil나옴

→ 가 버튼의 클로저에 브레이크 포인트는 걸리지만 내부에는 안걸림, 즉 내가 클로저 값전달 부분이 실행된 것으로 착각..

 

중요한건 present(OR push)를 클로저 전달하는 부분이랑 같이 안 담아주면 계~속~ nil …. 절대 반영안됨

 

VC1에서 present 하면 VC2에서 뷰 디드로드까지 하고 다시 VC1로 돌아와서 present를 한번 더 실행함. 그때 비로소 VC2 화면이 뜸. 값을 주고 받는 부분과 present하는 장소가 다르니까 얘가 잡아내질 못하는듯

 

present가 되고 → VC1으로 전달하고 싶은 값을 넣어주고 → 저장버튼처럼 클로저를 호출하는 메서드를 실행시켰을 때

 

클로저가 실행되면서 그 때 클로저도, 값도 모두 전달됨, 그 전까지는 그냥 클로저를 담을 수 있는 바구니, 값을 담는 바구니 등등을 준비만하는듯...?

 

dismiss(pop)은 어디에 해도 상관없음.

음..! 지저분하군!

 

아 진작 클로저를 프린트해볼껄...ㅠ

틀린 부분이 있다면 알려주세요,,,🥺

'🌱' 카테고리의 다른 글

Closure 2/3  (0) 2022.10.29
Closure 1/3  (0) 2022.10.28
Equatable  (0) 2022.08.18
forEach와 for_in 차이  (0) 2022.08.17
UIButtonConfiguration  (0) 2022.08.15