티스토리 뷰

반응형

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
링크
«   2024/04   »
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
글 보관함