티스토리 뷰
아래 같은 상황처럼
Detail VC (내용수정) -> 저장 -> 화면 dismiss -> Main VC에 반영
위의 기능을 해보려고 합니다.
ViewController 간에 데이터를 전달하는 방법은 Notification, Delegate 등이 있는데
오늘은 Delegate를 이용한 데이터 전달 방법에 대해 공부해 보겠습니다.
Detail VC (데이터를 보내는곳)
Delegate 패턴을 적용하기 위해선
protocol을 사용해야 하는데요.
해당 protocol은 채택, 준수, 대리자 위임을 해줘야 합니다.
먼저 protocol을 생성해 줍니다. (SendDataDelegate)
// DetailViewController.swift
protocol SendDataDelegate { // 프로토콜 선언
func sendData(data: String)
}
class DetailViewControll: UIViewController {
// ...
}
protocol은 메소드를 정의만 해줘요 구현은 하지 않습니다.
영화로 치면 예고편(trailer) 이라고 생각하시면 됩니다.
예고편을 보면 영화에 어떤 장면들이 나올지 알 수 있듯,
SendDataDelegate 라는 protocol안에 func sendData(data: String) 메소드 라는게 있네 ?
즉, SendDataDelegate를 채택 하고 위임 (.delegate = self) 한 곳 에선 sendData(data: String) 메소드가 어떻게 쓰일지 알 수 있게 해주죠.
Detail VC 에 protocol 타입의 delegate 변수를 만들어줍니다.
// DetailViewController.swift
protocol SendDataDelegate { // 프로토콜 선언
func sendData(data: String)
}
class DetailViewControll: UIViewController {
var delegate: SendDataDelegate? // 프로토콜 변수 선언
}
그리고 '저장' 버튼을 눌렀을때 데이터를 보낼 부분
// DetailViewController.swift
@objc func saveTapped() {
if let data = dataTextField.text {
delegate?.sendData(data: data) // 데이터 전송
}
dismiss(animated: true, completion: nil)
}
textField에 입력된 값이 있을경우
sendData(data: data)의 인자값에 넣어주게 됩니다.
여기까지만 하면 Detail VC 에서 할일은 끝 입니다.
Main VC (데이터를 받는곳)
1. 채택
Delegate를 이용해서 데이터를 받아올 겁니다.
먼저 class MainViewController에 SendDataDelegate를 채택 해줍니다.
// MainViewController.swift
class MainViewController: UIViewController, SendDataDelegate { // 프로토콜 채택
// ...
}
2. 준수
채택을 하게 되면 SendDataDelegate 프로토콜에 있는 메소드 func sendData(data: String) 을 사용해줘야 합니다.
이렇게 해주는걸 '프로토콜을 준수 해준다' 고 합니다.
NOTE
가독성을 위해 채택을 할때는 extension으로 따로 빼놓는것이 좋습니다.
extension MainViewController: SendDataDelegate { func sendData(data: String) { dataLabel.text = data } }
3. 위임
데이터를 받아올 Detail VC 에 대리자 위임을 해주기만 하면 끝납니다.
@objc func tappedButton() {
let detailVC = DetailViewController()
detailVC.delegate = self // 대리자 위임
present(detailVC, animated: true, completion: nil)
}
여기서 self는 Main VC를 말합니다.
여기까지 구현해놓고 실행해보면 !!
Detail VC -> Main VC 로 데이터가 잘 전달되는걸 볼 수 있습니다!!
전체 코드는 Github에 올려 놓았으니 참고하세요!!
저는 Snapkit 라이브러리를 사용해 코드로 작업을 했습니다.
iOS 처음 공부할 때는 delegate가 막막하고 무슨 말인지 하나도 몰랐었는데
이제 조금씩 코드가 읽히네요 ㅎㅎㅎ
Delegate 패턴이 자주쓰인다고 하니 추후 많이 써보면서 익혀놔야겠습니다.
'iOS' 카테고리의 다른 글
[Swift] 메소드 Methods (0) | 2022.03.23 |
---|---|
[iOS] GCD Tutorial: Dispatch Groups (0) | 2022.03.20 |
[iOS] CollectionView - Empty state (데이터가 없을시 보여줄 화면) (0) | 2022.03.16 |
[iOS] async,sync 와 serial, concurrent의 차이? (0) | 2022.03.13 |
[iOS] 네비게이션바 뒤로가기 버튼 커스텀 - navigationBar back button custom (0) | 2022.03.11 |
- Total
- Today
- Yesterday
- Swift 내림차순
- Swift final
- Swift inout
- 원티드 프리온보딩
- swift reduce
- Swift
- Swift Error Handling
- removeLast()
- Swift 알고리즘
- Swift init
- Swift RIBs
- Swift 프로퍼티
- swift programmers
- Swift Leetcode
- swift 고차함수
- Class
- ios
- Swift joined
- iOS error
- swift protocol
- Swift joined()
- RIBs tutorial
- Swift ModernRIBs
- Swift 프로그래머스
- CS 네트워크
- Combine: Asynchronous Programming with Swift
- swift property
- swift (programmers)
- 2023년 회고
- RTCCameraVideoCapturer
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |