viewWillAppear

lhj26·2022년 6월 3일
0

iOS Error Solution

목록 보기
1/2

NOTE
이 글에서는 iOS 공부중 발생한 에러 원인, 솔루션 등을 기술한다.

viewWillAppear

viewWillAppear은 View Controller(VC)의 Life Cycle(생명 주기)에 속하는 메소드이다.

NOTE
App Life Cycle과 VC Life Cycle에 관한 정리글은 추후에 작성할 예정.

VC의 Life Cycle

viewWillAppear 메소드의 호출되는 시기는 viewController의 view가 view hierarchy(뷰 계층 구조)에 추가되기 전에 호출된다. view가 화면에 보이기 직전에 호출된다고 생각하자. 그러므로 status bar의 방향이나 스타일과 같이 화면에 보이기 직전에 변경하고자 하는 코드를 override 하여 추가할 수 있다. 즉 이 메소드는 view가 화면에 처음 보일 때, 그리고 다른 화면에 가려졌다가 다시 나타난 경우에 호출이 된다.

본인은 present 메소드를 이용하여 새로운 화면을 호출한 뒤, 이전 화면에서 처음 화면으로 값을 전달하기 위해 dismiss메소드로 다시 이전 화면으로 돌아갔다. 그리고 처음 화면의 viewWillAppear에 custom code를 작성하는 작업을 하였다. 본인은 화면을 전환했으므로 처음 view는 disapperaing 상태가 되어 화면에 보이지 않고, 다시 이전 화면으로 돌아왔을 때는 viewWillAppear가 호출이 된다고 생각했다. 그러나 NSLog를 찍어보니 호출이 되지 않는 것을 확인했다. 본인이 사용한 방법은 몇 년 전에 책에 기술된 사용한 방법이므로 버전이 달라지면서 발생한 문제라고 생각하고 구글링을 시도했다. (참고한 자료)

확인해 본 결과 iOS의 13버전 이후 앱의 modalPresentationStyle이 iOS13이전에는 UIModalPresentationFullScreen이었으나 현재는 UIModalPresentationAutomatic으로 기본 설정이 된다고 한다. 즉 이제 앱의 기본 프레젠테이션이 전체 화면이 아닌 페이지 시트라고 한다. 그러므로 present 방식으로 화면을 전환했을 때 호출된 view가 fullScreen이 아니라서 이전 view가 화면에 완전히 가려지지 않아, 메모리에서 제거되지 않았으므로 이전 화면으로 돌아가도 다시 viewWillAppear가 호출되지 않는 문제였다.

이를 해결하는 솔루션은 2가지 방법이 있는데 이는 값 변경 방법만 다를 뿐 결론은 modalPresentationStyle값을 fullScreen으로 변경하는 것으로 같다.

  1. code에서 변경하기
@IBAction func onSubmit(_ sender: Any) {
        guard let rvc = self.storyboard?.instantiateViewController(withIdentifier: "RVC") as? ResultViewController else {
            return
        rvc.modalPresentationStyle = .fullScreen
        self.navigationController?.pushViewController(rvc, animated: true) // 네비게이션 방법
    }
  1. xcode의 Attribute inspector에서 Presentation값을 Full Screen으로 변경하기

default는 automatic으로 되어있다. (호출되는 화면의 프레젠테이션을 Full Screen으로 변경)
위 2가지 방법을 사용하면 viewWillAppear 메소드가 정상적으로 호출되는 것을 확인할 수 있다.

0개의 댓글