다른 뷰컨트롤러의 변수를 가져오는 방법

let mapViewController = self.storyboard?.instantiateViewController(withIdentifier: "MapViewController") as! MapViewController
print(mapViewController.poiItems)

이런식으로 구현하면 데이터가 있음에도 불구하고 nil이 출력됩니다.
현재 뷰컨트롤러에서 다른 뷰컨트롤러로 화면전환을 하지 않고 다른 뷰컨트롤러 화면을 수정하는 방법이 궁금합니다.

좋아요 1

질문의 코드는 스토리보드에서 MapViewController 객체를 생성하자 마자 poiItems 값을 출력하는 코드네요.

해당 뷰 컨트롤러의 프로퍼티에 값이 있으려면 다음과 같은 동작이 있어야 겠죠.

  • 외부에서 직접 값을 주입기
  • 해당 뷰 컨트롤러가 화면에 나타나서 poiItems에 값이 설정되는 인터랙션을 수행

즉 print 하는 시점에서는 데이터가 없어서 nil이 나오는 것입니다.

좋아요 1

MapViewController에서 poiItems에 값이 설정된 후 다른 뷰컨트롤러에서 해당 poiItems를 가져오는 방법은 없을까요?

좋아요 1

좀 더 상황 정보가 있으면 좋겠네요.

뷰 컨트롤러와 데이터의 관계를 고민해야 합니다.

  1. poiItems는 MapViewController에 종속적인 데이터이고 신 이동에 따라서 선택된 내용만 전달되는가?
  2. poiItems는 앱의 여러 신에서 공유해서 사용되는 데이터인가?

2번 상황이라면 뷰 컨트롤러와 독립적인 모델을 만드는 게 좋습니다.

좋아요 1

@wannabewize 님의 답글에 덧붙이자면,

현재 @kdh5163 님이 고려하고 있는 모델을 유지하려면 delegate 프로토콜을 만들어서 poiItems가 추가된 뒤 특정 함수를 호출할 수 있겠죠.

또는 좋은 방법은 아니지만 NSNotification을 이용해서 앱 내에서 특정 이벤트에 대해 broadcast해 버리는 방법도 있답니다.