안녕하세요 !
오늘은 Delegate로 ViewController 간에 data 전달하는 법에 다뤄보겠습니다.
Delegate 패턴 말고도 Swift에서 데이터를 전달하는 방법은 여러가지가 있습니다 😄
FLO 뮤직플레이어 앱을 만들면서 가사를 보여주는 모달 뷰에서 일시정지/재생 버튼
을 눌렀을때
음악재생 화면에서도 이 버튼이 업데이트 되도록 구현해보았습니다.
iOS 13부터 modal 기본값이 fullscreen 방식이 아닌 sheet 형태로 보여집니다.
fullscreen이 아니면 modal 창이 내려갔을때 dismiss 관련 메소드가 호출되지 않아요 ..!
fullscreen이면 dismiss 관련 메소드에서 업데이트 로직을 처리해도 되지만, 기본값인 sheet를 이용할 것이기 때문에
delegate를 이용해서 업데이트 로직을 구현해봅시다 !
PlayerMusicView에서 LyricView 를 Present Modally로 띄울거잖아요 ?
Segue
를 연결해주고, Identifier
를 show로 지정해줍니다. (Identifier는 하고싶은 이름으로..)
저는 LyricViewController에서 data를 보내기 때문에 LyricViewController에서 protocol을 선언해줬어요.
현재 음악이 재생중인지 아닌지를 전달할거라서 playing을 Bool 값으로 전달하겠습니다.
전달해야 하는 값
을 인자로 선언해주세요. 문자열이면 String.. 숫자면 Int 이런식으로요 !
✅ 여기도 LyricViewController에서 코드를 작성하는 것입니다 !! (data를 보내는 ViewController)
delegate 프로퍼티를 선언하고, 보내줄 데이터를 파라미터로 넣어서 호출합니다.
저는 LyricViewController가 없어지는 경우가 두가지에요. modal을 일반적으로 없애는 방식인 손으로 쓰윽 내리는거,
❌ 버튼을 눌러서 내려가도록 하는 방법. 그래서 이 두가지 방법을 커버하기 위해
LyricViewController가 없어지기 전에 호출되는 viewWillDisappear
에서 구현했습니다.
delegate 변수 sendUpdate 메소드에 playing 파라미터를 넣어줍니다.
여기서는 sendUpdate 메소드를 구현하는게 아니라 ! 호출만 합니다. 구현은 받는 쪽 ViewController에서 할겁니다.
어떤 버튼을 눌렀을 때 data를 전달해야 하는 경우라면 아래 부분과 같은 버튼 action 메소드
안에서 구현해주세요 !
✅ 여기서는 PlayMusicViewController에서 (데이터 받는 쪽) 구현해야 합니다 !!
LyricViewController에서 Data를 보내면 PlayMusicViewController에서 Data를 받아 업데이트 해야 합니다.
PlayMusicViewController에서 만들어줬던 protocol
를(SendUpdateDelegate) 채택합니다.
채택하면 자동으로 저렇게 오류가 나서 알려줄겁니다. sendUpdate를 구현해줘야 되기 때문이죠.
해당 오류를 클릭하면 메소드가 자동으로 만들어지고 거기서 구현해줍니다.
✅ 여기서도 PlayMusicViewController에서 (데이터 받는 쪽) 구현해야 합니다 !!
Data를 보내는 쪽(LyricViewController)에서 delegate 프로퍼티를 선언했었잖아요 ?
이 delegate 프로퍼티를 대신해서 처리하는게 PlayMusicViewController(데이터 받는쪽)라고 위임해줍니다.
맨 처음에 segue identifier를 "show" 라고 만들어줬습니다.
PlayMusicViewController에서 LyricViewController를 show 라는 segue로 modal을 띄울거잖아요?
이 때 !! PlayMusicViewController가 대리자가 되겠다는 것을 알려주는 겁니다.
viewController.delegate = self
여기서 viewController
는 LyricViewController이고, self
는 PlayMusicViewController 이니까요 !
자 이렇게 하면 delegate로 데이터가 잘 전달됩니다 😄