Roen의 iOS 개발로그

whose view is not in the window hierarchy 로그의 원인과 해결

by Steady On

 

openAPI로 데이터를 가져오는 네트워킹 실습을 하면서, 랜덤으로 맥주를 하나 골라서 띄워주는 View를 만들게 되었다. view를 만들면서, 아무래도 "오늘의 맥주 추천!" 같은 느낌이니까 뭔가 컨텐트가 가려져 있다가 버튼을 누르면 "짜잔~!" 하고 나타나면 재밌을 것 같다는 생각이 들었다.

 

설명을 돕기위한 예시화면

 

그래서 열심히 coverView를 만들고 viewDidLoad에서 present 함수로 불러왔는데 시뮬레이터 상에서는 문제가 없었지만, 터미널에 신경쓰이는 문구가 나타났다!!

 

"whose view is not in the window hierarchy"

검색해보니 viewDidLoad에서 모달뷰와 같은 다른 어떤 ViewController를 띄우려고 할 때 발생하는 로그로 ViewController의 LifeCycle과 관련된 이슈였다.

 

공식문서를 살펴 보면 viewDidLoad

"This method is called after the view controller has loaded its view hierarchy into memory."
"이 메서드는 view controller가 해당 뷰 계층을 메모리에 로드한 후에 호출된다."

이렇게 설명되어 있다. 이제 막 메모리에 올리고 나서 자기가 가진 인스턴스 프로퍼티들을 만들고 view controller의 전체 수명주기 동안 존재할 view를 만들려는, 그러니까 아직 view controller가 완성되지 않은 때이다. 그런데 바로 또 위에 올릴 새로운 ViewController가 호출되어 버려서 "아직 저도 준비가 안됐는데요?"라는 느낌이랄까? 아직 1층도 덜지었는데 2층을 지으라고 하는 상황이 되어버린 것이다. 다시 한번 로그를 잘 보면,

"window 계층에 없는 view"

라고 말하고 있다. 이를 토대로 생각해보면, view controller가 완성되고 view가 hierarchy에 잘 올라간 뒤에 새로 올라갈 view controller를 불러주면 안정적으로 불러올 수 있겠다는 생각이 든다! 그럼 그 시점은 언제 알 수 있을까?

 

여기서 viewDidAppear의 정의를 한번 살펴보면,

Notifies the view controller that its view was added to a view hierarchy.
view controller의 view가 view hierarchy에 추가되었음을 알린다.

빙고! 그래서 viewDidAppear에서 modal을 띄워주니까 더이상 해당 메세지는 나오지 않게 되었다!

 

 

 
 

블로그의 정보

Roen의 iOS 개발로그

Steady On

활동하기