뷰컨트롤러간 데이터를 전달하는 방법에 대해 공부하다가,
VC1에서 VC2로 화면전환을 하면서 데이터를 넘겨주고 싶었다.
//화면 전환하며 VC2의 changeStockLabel() 함수 실행하여 현재재고 라벨에 업데이트
func presentStockModifyView() {
guard let stockModifyNC = storyboard?.instantiateViewController(withIdentifier: "StockModifyNavController") else { return }
let stockModifyVC = stockModifyNC.children.first as? StockModifyViewController
stockModifyVC?.loadViewIfNeeded()
stockModifyVC?.changeStockLabel()
present(stockModifyNC, animated: true, completion: nil)
}
loadViewIfNeeded()
을 사용하기 전에는,
stockModifyVC?.changeStockLabel()
으로 화면전환시 라벨이 바뀌기를 바랬는데,, VC2로 화면이 전환되어도 라벨이 안바뀌었다.
그래서 print(stockModifyVC?.isViewLoaded)
로 저 시점에서 VC2가 로드되었는지 확인해보니 false 가 나왔다. VC2의 뷰가 로드되기도 전에 VC2의 메서드를 사용하려 했으니,, 당연히 안되는거지,,
따라서, 뷰를 로드해주는 메서드 loadViewIfNeeded()
를 사용하여 뷰를 먼저 로드한 후에 메서드를 실행해서 해결했다.
이런 상황이 발생한 이유는
ViewController의 View는 lazy하게 로드되어서이다.
storyboard
를 이용해서 instantiateViewController
로 뷰컨트롤러의 인스턴스를 만들어도 사용되지않으면 view가 로드되지않는다.
따라서 임의적으로 로드하고 나서 사용해야하는 것이다.
How To: Pass Data Between View Controllers in Swift
[iOS] loadViewIfNeeded 이거 왜 쓰는거에요?