delegate를 이용해 view controller 간 정보를 주고 받기

segue 를 이용해, destination view controller 로 정보를 넘기며 이동된 이후, 반대 방향으로(destination에서 원래 segue를 수행했던 view로) 정보를 다시 넘겨주고 싶다면?

1.넘겨주고 싶은 데이터가 있는 view controller(ListDetail)에서의 작업
아래의 사진과 같이 protocol을 이용해 delegate를 선언해준 후, 해당 delegate 변수를 뷰 컨트롤러 내에 선언해 줍니다.

이후 아래와 같이, 데이터를 넘겨주고 싶은 시점에서, delegate 내의 함수를 호출해 원하는 정보를 넘겨줍니다.
저는 함수 호출 이후 네비게이션컨트롤러의 popViewController 나 self의 dimiss 등을 이용해 이전 화면으로 돌아가도록 해 주었습니다.

2.segue를 수행했던, 정보를 받고 싶은 view controller 에서의 작업
아래 사진과 같이, 선언해 두었던 delegate를 (sendBackDelegate) 사용하고, 그 안의 구현을 마무리하면서 데이터를 전달받아 원하는 작업을 진행해 줍니다.

또한, 아래 사진과 같이 destination에 선언해뒀던 delegate = self 를 통해, 선언한 delegate 를 사용할 수 있도록 합니다.

이렇게 하면, segue를 통해 넘어간 view controller 에서 원하는 정보를 넘겨주면서, 다시 원래 view controller 로 돌아올 수 있게 됩니다.

좋아요 3

저는 테이블 뷰에서 특정 cell 선택 시 넘어간 detail 화면에서 삭제버튼을 눌렀을때, 서버에서 삭제를 진행하고, 또한 기존 테이블뷰에서도 cell을 삭제할 수 있도록 위와 같은 방법을 사용했습니다.
segue 를 통해 상세화면의 cell의 index 정보를 함께 넘겨주고, 삭제 버튼을 클릭하면 해당 index를 다시 delegate 를 통해 기존 테이블 뷰가 있던 view controller 로 넘겨줍니다. 이후 데이터를 관리하고 있던 memoList 에서 받아온 index 정보를 토대로 데이터를 제거하고, 테이블뷰.reloadData() 를 통해 갱신을 진행했습니다.
혹시 저와 같은 방식으로 테이블 뷰에 cell 삭제를 반영하고 싶은 분이 계신다면 도움이 됐으면 좋겠습니다

좋아요 2

delegate에 대해 잘 정리해 주셨네요. 딱 용도에 맞는 좋은 사용법인 것 같아요.

혹시 삭제 버튼을 unwind segue로 연결하면서 해당 작업을 진행하는 것도 시도해 봤나요?
기능이 단편적이긴 하지만 이 용도 이외에 델리게이트 활용처가 없다면 해 볼만 할 듯 해서요.

좋아요 1

화면 전환에 대해 찾아보면서 unwind segue 를 봤었는데 데이터를 넘기는데 집중하다보니 위의 게시글과 같은 방식을 시도하게 되었습니다. 지금 생각해보니 돌아갈 view controller 에 접근해서 변경하는 방식의 작업도 가능하겠네요! 좋은 답변 감사합니다

좋아요 1