티스토리 뷰

반응형

iOS에서는 View가 화면에 나타나거나 사라질 때 호출되는 메서드들이 정의되어있다. 그중 오늘 시행착오를 겪은 viewWillAppear에 대한 글을 작성하려고 한다.

Declaration

func viewWillAppear(_ animated : Bool)

Discussion

이 메서드 이름 그대로 해석하게 되면 뷰가 곧 나올 것이라고 예상될 때 호출된다고 볼 수 있다. 이는 xcode에서 프로젝트를 생성 시 자동으로 생성되는 viewController.swift의 viewDidLoad 메서드와 큰 차이점이 있다. viewDidLoad는 처음 뷰가 나타날 때 한 번만 호출되지만 viewWillAppear은 뷰가 나타날 때마다 호출된다. 즉 뷰가 보일 때마다 새로운 작업을 하고 싶을 때 사용하면 좋다.

문제점

그런데 뷰가 나타날 때마다 호출되어야 할 viewWillAppear함수가 나타날 때마다 호출이 되지 않았다. 일단 문제가 생긴 것을 간소화한 실행화면을 보자.

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.

viewWillAppear이 호출 안됨

 

위의 화면은 흰색 배경의 화면에서 버튼을 누르면 주황색 배경의 화면을 띄우고 주황색 배경의 화면을 누르면 dismiss로 주황색 화면을 메모리에서 해제하는 방식의 코드를 실행한 화면이다. 흰색 화면의 뷰 컨트롤러에 viewWillAppear을 사용했고 호출될 때마다 "viewWillAppear"이라는 로그를 남기게 작성했지만 처음 띄워질 때를 제외하고는 다시 호출되지 않는 것을 볼 수 있다.

 

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.

viewWillAppear 잘 호출됨

 

이를 수정한 화면이다. 이제는 흰색 배경의 화면이 나타날 때마다 viewWillAppear이 잘 호출되는 것을 볼 수 있다. 차이는 다음 화면을 불러낸 방식에 있다. 호출이 되지 않을 때는 full screen으로 다음 화면을 보인 것이 아니라 자세히 보면 화면에 흰색 화면이 숨겨져 있는 것을 볼 수 있다. 하지만 호출이 될 때는 full screen으로 다음 화면을 보여 흰색 화면이 아예 보이지 않는 것을 볼 수 있다. 하지만 둘 다 흰색 화면을 메모리에서 제거한 것이 아닌데 이러한 결과가 나타나게 되었다. full screen이 아닌 상태로 다음 화면을 불러내게 되면 이전 화면이 화면에 보인다고 판단하는 것 같다. 실제로 조금이지만 보이기도 했다. 이러한 결과는 내비게이션 뷰를 보이거나 모달로 뷰를 보이게 할 때도 같은 결과를 보였다.

 

Apple 공식 문서 - viewWillAppear에 보면 pop over 방식의 뷰 컨트롤러가 dismiss 된 후 viewWillAppear이 정의된 뷰 컨트롤러가 화면에 나타나게 되는 경우에는 viewWillAppear메서드가 호출되지 않는다는 정보가 있는데 이러한 문제를 말하는 것 같다.

 

만약 다음에 이러한 문제가 발생한다면 viewWillAppear가 정의된 뷰 컨트롤러를 사용하기 위해선 pop over방식의 뷰 컨트롤러에서 이동하는 방식은 피해야 오늘의 문제가 재발하지 않을 것 같다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함