Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Observable
- tableView
- 리펙터링
- 애니메이션
- Xcode
- rxswift
- UICollectionView
- ribs
- SWIFT
- swift documentation
- combine
- 스위프트
- ios
- UITextView
- 클린 코드
- Refactoring
- uiscrollview
- collectionview
- RxCocoa
- 리팩토링
- map
- Clean Code
- swiftUI
- clean architecture
- uitableview
- 리펙토링
- HIG
- Human interface guide
- Protocol
- MVVM
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] 화면 간 데이터 전달, 데이터 넘기기 (modal, pageSheet, navigation에서 delegate를 이용한 방법) 본문
iOS 응용 (swift)
[iOS - swift] 화면 간 데이터 전달, 데이터 넘기기 (modal, pageSheet, navigation에서 delegate를 이용한 방법)
jake-kim 2021. 9. 7. 23:50.pageSheet에서의 viewWillAppear 동작 안하는 것 주의
- A가 밑에 있고 B가 위에 존재할때 modalPresentationStyle = .pageSheet 방법은 B가 dismiss시에 A는 viewWillAppear호출이 안되는 것 주의
@objc
private func didTapButton(_ sender: Any) {
let secondViewController = SecondViewController()
secondViewController.modalPresentationStyle = .pageSheet
present(secondViewController, animated: true, completion: nil)
}
- .fullScreen 방식은 B가 dismiss된 경우, A에서 viewWillAppear 매번 호출
@objc
private func didTapButton(_ sender: Any) {
let secondViewController = SecondViewController()
secondViewController.modalPresentationStyle = .fullScreen
present(secondViewController, animated: true, completion: nil)
}
- navigation에서는 viewWillAppear 동작
Delegate를 통한 데이터 전달
(+ pageSheet에서 dismiss된 경우 이벤트 수신 방법)
- delegate 흐름
- delegate 선언, 구현: 데이터가 필요한 곳
- delegate 실행: 데이터를 주는 곳
- delegate protocol로 정의 (데이터가 필요한 곳에서)
// FirstViewController.swift
protocol SecondViewControllerDelegate: AnyObject {
func dismissSecondViewController()
}
- delegate 할당 (데이터가 필요한 곳에서)
// FirstViewController.swift
@objc
private func didTapButton(_ sender: Any) {
let secondViewController = SecondViewController()
secondViewController.delegate = self
secondViewController.modalPresentationStyle = .pageSheet
present(secondViewController, animated: true, completion: nil)
}
- 메소드 구현 (데이터가 필요한 곳에서)
// FirstViewController.swift
extension FirstViewController: SecondViewControllerDelegate {
func dismissSecondViewController() {
viewWillAppearEventCount += 1
countLabel.text = "pageSheet인 두 번째 뷰의 dismiss 카운트 = (\(viewWillAppearEventCount))"
}
}
- weak var delegate 객체 (데이터를 주는 곳)
- weak var로 선언하는 이유: 참조 카운트의 정확한 이해 참고
// SecondViewController.swift
weak var delegate: SecondViewControllerDelegate?
- dismiss될때 delegate를 실행하여 FirstViewController에서 실행되도록 적용
// SecondViewController.swift
@objc func didTapButton(_ sender: Any) {
delegate?.dismissSecondViewController()
dismiss(animated: true, completion: nil)
}
* 전체 소스코드: https://github.com/JK0369/DelegateExample
'iOS 응용 (swift)' 카테고리의 다른 글
Comments