didMoveToWindow를 활용한 뷰 컨트롤러 간 데이터 전송

작성일 :

didMoveToWindow를 활용한 뷰 컨트롤러 간 데이터 전송 방법

Swift에서 뷰 컨트롤러 간 데이터 전송은 앱 개발에서 자주 필요한 기능입니다. 다양한 방법이 있지만, 여기서는 didMoveToWindow 메서드를 활용한 데이터 전송 방법에 대해 설명합니다. 이 메서드는 UIView의 생명 주기 중 하나로, 뷰가 윈도우에 추가되었거나 제거될 때 호출됩니다. 이를 이용해 뷰가 윈도우에 추가되었을 때 데이터를 전송하는 안전하고 효율적인 방식에 대해 살펴보겠습니다.

didMoveToWindow 메서드

didMoveToWindowUIView 클래스의 메서드로, 뷰가 윈도우에 추가되거나 윈도우에서 제거될 때 호출됩니다. 이 메서드는 사용자 인터페이스 요소가 화면에 나타나는 시점을 제어하는 데 유용하게 사용할 수 있습니다.

기본 구현

먼저, didMoveToWindow 메서드의 기본적인 구현을 살펴보겠습니다.

swift
import UIKit

class CustomView: UIView {
    override func didMoveToWindow() {
        super.didMoveToWindow()
        if self.window != nil {
            // The view has been added to a window
            print("View was added to a window.")
        } else {
            // The view was removed from its window
            print("View was removed from a window.")
        }
    }
}

위 코드에서 CustomView 클래스는 UIView를 상속하며, didMoveToWindow 메서드를 오버라이드하여 뷰가 윈도우에 추가되거나 제거될 때 간단한 로그 메시지를 출력합니다.

뷰 컨트롤러 간 데이터 전송

이제 didMoveToWindow 메서드를 활용하여 두 개의 뷰 컨트롤러 간에 데이터를 전송하는 방법을 살펴보겠습니다. 예제로 SourceViewControllerDestinationViewController를 만들고, didMoveToWindow 메서드를 통해 데이터를 전송해 보겠습니다.

데이터 모델 정의

먼저, 전송할 데이터를 담을 간단한 모델을 정의합니다.

swift
struct DataModel {
    var title: String
    var description: String
}

SourceViewController 구현

이제 데이터를 생성하고 DestinationViewController로 전송하는 SourceViewController를 구현합니다.

swift
import UIKit

class SourceViewController: UIViewController {
    var dataToSend: DataModel?
    @IBOutlet weak var sendDataButton: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        // 데이터 모델 초기화
        dataToSend = DataModel(title: "Sample Title", description: "This is a sample description.")
    }

    @IBAction func sendDataButtonTapped(_ sender: UIButton) {
        let destinationVC = DestinationViewController()
        destinationVC.dataReceiver = self.dataToSend
        self.navigationController?.pushViewController(destinationVC, animated: true)
    }
}

SourceViewController에서는 간단한 DataModel 객체를 초기화하고 버튼을 탭할 때 DestinationViewController로 데이터를 전송합니다.

DestinationViewController 구현

이제 DestinationViewController에서 데이터를 수신하고 didMoveToWindow 메서드를 활용하여 초기화를 수행합니다.

swift
import UIKit

class DestinationViewController: UIViewController {
    var dataReceiver: DataModel?
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var descriptionLabel: UILabel!

    // didMoveToWindow 메서드를 오버라이드 합니다.
    override func didMoveToWindow() {
        super.didMoveToWindow()
        if self.view.window != nil {
            if let data = dataReceiver {
                self.titleLabel.text = data.title
                self.descriptionLabel.text = data.description
            }
        }
    }
}

DestinationViewController에서는 dataReceiver 프로퍼티를 통해 전달된 데이터를 수신받고, didMoveToWindow 메서드에서 윈도우에 추가될 때 데이터를 UI에 반영합니다.

마무리

이 글에서는 didMoveToWindow 메서드를 활용하여 뷰 컨트롤러 간 데이터를 전송하고 이를 UI에 반영하는 방법에 대해 설명했습니다. didMoveToWindow 메서드는 뷰의 생명 주기 중 중요한 시점을 제공하여 데이터를 안전하고 효율적으로 처리할 수 있게 합니다. 이 방법을 통해 다양한 상황에서 사용자 인터페이스를 더욱 효과적으로 제어할 수 있습니다.