[iOS] whose view is not in the window hierarchy 오류 해결

ellyheetov·2021년 7월 7일
1
post-thumbnail

원하는 기능

특정 뷰 컨트롤러가 나타났을때 모달 뷰를 띄우는 동작을 수행하려고 한다.

override func viewDidLoad(_ animated: Bool) {
	// 모달 뷰 관련 함수
}

오류

모달뷰(ViewController, Alert)를 띄우는 코드를 작성 했는데, 띄워지지 않는다.

컴파일 에러는 없지만, 앱을 실행한 뒤 console에 "whose view is not in the window hierarchy" 로그가 있다.

원인

해당 오류는 UIViewController의 override 함수인 viewDidLoad()에서 모달 뷰를 띄울 때에 발생하는 오류이다.

해결

모달 뷰를 띄어야 하는데 그럼 어디서 띄워야 하는 걸까?

비슷한 기능을 하는 override 함수인 viewDidAppear() 내부에 코드를 작성하는 방법으로 해결 할 수 있다.

override func viewDidAppear(_ animated: Bool) {
	// 모달 뷰 관련 함수를 이곳에 작성
}

왜?

그렇다면 비슷한 두 함수 viewDidLoad()viewDidAppear() 가 어떤 차이가 있는 걸까?

ViewController의 LifeCycle과 관련된 이슈이다.

viewDidLoad()

Called after the controller's view is loaded into memory.

viewDidLoad()는 컨트롤러의 뷰가 메모리에 올라갔을 때 한번만 호출되는 함수 이다.

해당 에러가 발생했던 원인은 ViewController가 메모리에 올라가는 도중(인스턴스화) 새로운 뷰를 또 빌드하려고 하기 때문에 발생하는 것이다.

첫 번째 ViewController 위에 두 번째 ViewController가 호출되어야 하는데, 첫 번째 뷰 컨트롤러가 아직 생성되지 않았기 때문에 "나 부모 뷰가 누구야? 계층 구조가 이상해"라는 에러 메시지를 뿜어내는 것이다.

viewWillAppear()

해당 에러를 해결하기 위해서 viewWillAppear()에서 새로운 모달 뷰를 띄우는 로직을 추가 해보았지만, 여전히 실패했다.

apple이 말하는 viewWillAppear()메소드의 정의는 다음과 같다.

Notifies the view controller that its view is about to be added to a view hierarchy.

viewWillAppear()은 뷰 컨트롤러가 view 계층에 이제 막 추가 되고 있는 시점에 호출이 된다. 즉, ViewController가 아직 view 계층에 완전히 추가되지 않았기 때문에 여전히 해당 해러가 발생하는 것이다.

viewDidAppear()

반면, viewDidAppear()는 뷰 컨트롤러가 view 계층에 추가 되었음을 알리는 함수이기도 하다.

Notifies the view controller that its view was added to a view hierarchy.

viewDidAppear()함수 내부에서는 새로운 모달 뷰를 띄울 수 있다.
완전한 view 계층을 이루고 나서 호출되는 함수이기 때문이다.

결론

컨트롤러가 새로운 컨트롤러를 띄우기 위해서는 완전한 뷰 계층구조를 이루고 있어야 한다.

profile
 iOS Developer 좋아하는 것만 해도 부족한 시간

0개의 댓글