관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] didMoveToWindow() 메서드 (#뷰 라이프사이클) 본문

iOS 응용 (swift)

[iOS - swift] didMoveToWindow() 메서드 (#뷰 라이프사이클)

jake-kim 2023. 11. 13. 01:28

didMoveToWindow() 메서드

  • UIView 클래스의 라이프사이클 메서드
  • 해당 뷰를 가지고 있던 window 객체가 변경되었다는 의미
    • 해당 뷰가 윈도우에 추가되거나 윈도우에서 제거될 때 호출
    • present나 push를 통해서 UIViewController안에 UIView를 노출시키는데, 이 때 UIView 내부의 didMoveToWIndow() 메서드가 호출

https://developer.apple.com/documentation/uikit/uiview/1622527-didmovetowindow

didMoveToWindow() 활용

  • 이 메서드를 override하여 print해보면 이 뷰를 가지고 있는 VC가 present될때 한번 호출되고 dismiss될때 한번 호출
class SomeView: UIView {
    init() {
        super.init(frame: .zero)
        backgroundColor = .gray.withAlphaComponent(0.3)
    }
    
    required init?(coder: NSCoder) {
        fatalError()
    }
    
    override func didMoveToWindow() {
        super.didMoveToWindow()
    }
}
  • 뷰의 라이프사이클 체크가 가능
  • didMoveToWindow에서 해당 뷰가 등장하는지, 사라지는지 알려면 해당 뷰를 가지고 있는 window 인스턴스가 nil인지 확인하여 판단이 가능
    • window가 nil이 아니라면 해당 뷰가 window에서 사라지지 않았다는 의미
    • window가 nil이라면 해당 뷰가 window에서 사라졌다는 의미
    • 단) 해당 뷰가 retain cycle되어서 deinit되지 않아도 didMoveToWindow는 호출됨
class SomeView: UIView {
    init() {
        super.init(frame: .zero)
        backgroundColor = .gray.withAlphaComponent(0.3)
    }
    
    required init?(coder: NSCoder) {
        fatalError()
    }
    
    override func didMoveToWindow() {
        super.didMoveToWindow()
        if window == nil {
            print("제거됨")
        } else {
            print("추가됨")
        }
        
    }
}

 

* 전체 코드: https://github.com/JK0369/ExDidMoveToWindow

* 참고

https://developer.apple.com/documentation/uikit/uiview/1622527-didmovetowindow

Comments