관리 메뉴

김종권의 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)
}

A의 viewWillAppear이 불리지 않는 점 확인

  • .fullScreen 방식은 B가 dismiss된 경우, A에서 viewWillAppear 매번 호출
@objc
private func didTapButton(_ sender: Any) {
    let secondViewController = SecondViewController()
    secondViewController.modalPresentationStyle = .fullScreen

    present(secondViewController, animated: true, completion: nil)
}

A의 viewWillAppear이 불리는 점 확인

  • navigation에서는 viewWillAppear 동작

Delegate를 통한 데이터 전달

(+ pageSheet에서 dismiss된 경우 이벤트 수신 방법)

  • delegate 흐름
    • 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))"
    }
}
// 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

Comments