티스토리 뷰

ViewDidLoad()

뷰 컨트롤러의 컨텐츠뷰(뷰 계층에 최상위)가 생성되고 스토리보드로부터 로드되면 호출됩니다.

뷰 컨트롤러의 아울렛은 이 메서드가 호출될 때까지 유효한 값을 가집니다.

뷰 컨트롤러에 필요한 추가적인 설정을 수행할 때 이 메서드를 사용하세요.

일반적으로 iOS는 ViewDidLoad를 한 번만 호출하지만 컨트롤러가 처음 초기화 될때 필연적으로 컨텐츠 뷰가 만들어지는 것은 아닙니다.

대신에 시스템이나 다른 코드가 컨트롤러의 뷰 속성에 접근할 때 처음 lazily(지연) 생성됩니다.

 

ViewWillAppear()

뷰 컨트롤러의 컨텐츠 뷰가 앱의 뷰 계층에 추가되기 직전에 호출됩니다.

컨텐츠 뷰가 스크린에 나타나기 전에 발생하는 작업을 트리거할 때 이 메서드를 사용하세요.

이름에도 불구하고 시스템이 이 메서드를 호출한다고해서 컨텐츠 뷰가 보여지는 것을 보장하지는 않습니다.

뷰가 다른 뷰에 의해 가려지거나 숨겨질 수 있습니다.

이 메서드는 단순히 그 컨텐츠 뷰가 앱의 뷰 계층에 추가되려는 것을 나타냅니다.

 

ViewDidAppear()

뷰 컨트롤러의 컨텐츠 뷰가 앱의 뷰 계층에 추가된 직후에 호출됩니다.

컨텐츠 뷰가 스크린에 나타나자마자 발생하는 작업을 트리거할 때 이 메서드를 사용하세요. (예를 들어, 데이터fetch나 애니메이션)

이름에도 불구하고 시스템이 이 메서드를 호출한다고해서 컨텐츠 뷰가 보여지는 것을 보장하지는 않습니다.

뷰가 다른 뷰에 의해 가려지거나 숨겨질 수 있습니다.

이 메서드는 단순히 그 컨텐츠 뷰가 앱의 뷰 계층에 추가되려는 것을 나타냅니다.

 

ViewWillDisappear()

뷰 컨트롤러의 컨텐츠 뷰가 앱의 뷰 계층에 제거되기 직전에 호출됩니다.

치우는 작업을 수행할 때 이 메서드를 사용하세요. (예를 들어, 변화를 커밋하거나 first responder를 해제할 때)

이름에도 불구하고 시스템이 이 메서드를 호출한다고해서 컨텐츠 뷰가 가려지거나 숨겨지는 것을 보장하지는 않습니다.

뷰가 다른 뷰에 의해 가려지거나 숨겨질 수 있습니다.

이 메서드는 오직 컨텐츠 뷰가 앱의 뷰 계층에 제거되려고 할 때 호출됩니다.

 

ViewDidDisappear()

뷰 컨트롤러의 컨텐츠 뷰가 앱의 뷰 계층에 제거된 직후에 호출됩니다.

추가적으로 액티비티를 해체하는 작업을 수행할 때 이 메서드를 사용하세요.

이름에도 불구하고 시스템이 이 메서드를 호출한다고해서 컨텐츠 뷰가 가려지거나 숨겨지는 것을 보장하지는 않습니다.

뷰가 다른 뷰에 의해 가려지거나 숨겨질 수 있습니다.

이 메서드는 오직 컨텐츠 뷰가 앱의 뷰 계층에 제거됐을 때 호출됩니다.

 

 


실습

앱을 실행할 때 호출되는 메서드를 순서대로 로그로 확인해봤습니다.

🥺[AppDelegate.swift] application (14): didFinishLaunchingWithOptions
🥺[SceneDelegate.swift] scene (16): willConnectTo
🥺[SceneDelegate.swift] sceneWillEnterForeground (50): 
🥺[SceneDelegate.swift] sceneDidBecomeActive (56): 
🥺[MainVC.swift] viewDidLoad (30): 
🥺[MainVC.swift] viewWillAppear (36): 
🥺[MainVC.swift] viewDidAppear (45): 

 

뷰 생명주기 관련 레이블과 view가 랜덤색상으로 바뀌는 애니메이션을 설정해놨습니다.

ViewDidLoad와 ViewWillAppear은 애니메이션이 보이지 않는데 

ViewDidAppear은 애니메이션이 보입니다.

ViewDidAppear은 화면에 완전히 로드 되고 나서 메서드가 실행되기 때문입니다.

애니메이션 처리는 ViewDidAppear에서 하는게 좋겠죠

 

 

이번엔 노란 버튼을 눌러서 화면을 전환하고 다시 돌아왔을 때 로그입니다.

🥺[YellowVC.swift] viewDidLoad (19): 
🥺[MainVC.swift] viewWillDisappear (52): 
🥺[YellowVC.swift] viewWillAppear (25): 
🥺[MainVC.swift] viewDidDisappear (59): 
🥺[YellowVC.swift] viewDidAppear (31): 
🥺[YellowVC.swift] viewWillDisappear (37): 
🥺[MainVC.swift] viewWillAppear (36): 
🥺[YellowVC.swift] viewDidDisappear (43): 
🥺[MainVC.swift] viewDidAppear (45): 

 

뒤로가기 버튼을 누른 순간

ViewWillAppear가 실행됩니다.

그래서 뷰가 완전히 다 보이기 전에 이미 배경 색이 바뀌는 애니메이션이 적용돼서 색상이 바뀌기 시작합니다.

그러다가 뷰가 완전히 다 보이게 되면 다시 배경 색이 바뀌는 애니메이션이 ViewDidAppear에서 호출돼서 갑자기 색이 바뀝니다.

화면이 완전히 표시되어 ViewDidAppear의 애니메이션이 실행되는 것을 볼 수 있죠.

 

 

 

 

viewWillDisappear와 viewDidDisappear의 차이는 뭘까요.

 

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(true)
        DEBUG_LOG("")
        textField.resignFirstResponder()
        textField.text = nil
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(true)
        DEBUG_LOG("")
//        textField.resignFirstResponder()
//        textField.text = nil
    }
    

 

노란 버튼을 누르자마자 텍스트 필드의 글씨가 사라지고, 키보드도 바로 내려가기 시작하네요.

 

 

텍스트 필드의 글씨가 사라져있고 키보드도 내려가 있습니다.

 

 

 

 

 

반대로도 해봅시다.

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(true)
        DEBUG_LOG("")
//        textField.resignFirstResponder()
//        textField.text = nil
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(true)
        DEBUG_LOG("")
        textField.resignFirstResponder()
        textField.text = nil
    }
    

 

이번엔 텍스트필드의 글씨가 사라지지 않았습니다.

키보드 역시 내려가지 않았어요.

 

 

 

다시 그 전 화면으로 돌아왔더니 텍스트 필드의 글씨는 사라졌는데 키보드는 올라와있네요.

텍스트 필드에 커서가 있는거 보니 textField.resignFirstResponder()가 안된거 같네요.

 

 

 

iOS 13부터 모달뷰가 전체화면으로 보이지 않죠.

 

 

🥺[RedVC.swift] viewDidLoad (19): 
🥺[RedVC.swift] viewWillAppear (25): 
🥺[RedVC.swift] viewDidAppear (31): 

레드뷰가 모달로 나왔는데 한번 뷰를 내려볼게요.

 

로그입니다.

🥺[RedVC.swift] viewWillDisappear (37): 
🥺[RedVC.swift] viewDidDisappear (43): 

 

viewWillDisappear와 viewDidDisappear가 호출되지 않았습니다.

그래서 텍스트필드와 키보드가 그대로 있네요.

 

 

 

아래 부분을 잘 보면 뒤에 하얀 뷰가 보이죠

뷰가 사라지지 않고 뒤에 있습니다.

그래서 viewWillDisappear와 viewDidDisappear에서 처리하던 것들이 iOS13의 모달방식에서는 안됩니다.

 

 

 ViewController & View

댓글
공지사항