본문 바로가기

면접질문정리

[iOS] UIWindow의 역할은?

# UIWindow 객체의 역할이란? (feat. window)

🔑 핵심키워드: view의 계층 구조의 최상단, 컨테이너 역할, 이벤트 전달, view콘텐츠를 제공하지않고 view를 담는 컨테이너의 역할임
📋 스크립트: 앱의 뷰 계층 구조에서 최상단에 고정되어 있으며 화면 콘텐츠에 대한 컨테이너 역할을 합니다. 뷰와 뷰컨과 함께 동작하여 화면에 표시되는 뷰계층 구조에 터치이벤트를 전달하고, 화면 방향 변경과 같은 변경사항을 관리합니다.
UIWindow는 화면에 보이는 콘텐츠를 제공하지않습니다. 이는 View의 역할이구요, 이를 담는 모든 컨텐츠는 앱의 스토리보드에서 구성하는 rooViewController에서 제공합니다. UIWindow의 역할은 UIKit에서 이벤트를 수신하고, 관련된 이벤트를 rootVC 및 관련 View에 전달하는 것입니다.

https://yagom.net/forums/topic/%EC%95%BC%EA%B3%B0%EB%8B%B7%EB%84%B7-%EC%A7%88%EB%AC%B8%EB%AA%A8%EC%9D%8C-8/

# 꼬리에 꼬리를 무는 질문

# 어떤경우에 window객체를 새로 만들거나 만들어지나요 ?

🔑📋 스크립트:

  • 스토리보드를 사용하지않을 경우
    • 스토리보드는 자동으로 window가 생성되기 때문에, 스토리보드를 사용하지 않는 경우인 코드로 UI를 구성할때 window객체를 새로 만들어야 한다.
  • 외부디스플레이를 지원하는 앱의 경우 새로운 window를 생성한다. (듀얼모니터?)
  • 특정한 이벤트가 발생했을때 (예: 전화가 오는 경우)
    • 앱당 하나 이상의 window객체를 가지기때문에

이 세가지의 경우에 만들어지거나 만들어야하는 것으로 알고 있습니다.

https://medium.com/@Alpaca_iOSStudy/uiwindow-5e7a9d72c582

# rootViewController란 무엇인가요 ?

🔑 핵심키워드: view를 제공해주는 역할
📋 스크립트: window의 view를 제공해주는 역할입니다. 즉, 현재 화면에 가장 상위에 보여지는 view 콘텐츠를 보여주며 이는 UIViewController? 타입을 가진 프로퍼티입니다.
그래서 이 프로퍼티에 새로운 VC를 할당해주면 VC의 view가 콘텐츠 뷰로 설정이 되고 이전에 설정되있는 뷰는 제거됩니다.

https://developer.apple.com/documentation/uikit/uiwindow/1621581-rootviewcontroller

# 만일 스토리보드를 사용하지않는다면 어떻게 화면에 콘텐츠를 나타내주나요 ?

🔑 핵심키워드: iOS 13이전 AppDelegate, 이후는 SceneDelegate, rootViewController에 꽂아줘야한다. keyWindow
📋 스크립트: 프로젝트를 생성할때 자동으로 Xcode는 Main.storyboard를 통해 메인 window객체를 만들고 rootviewController를 설정하게 되어있습니다. 하지만 스토리보드를 사용하지않는다면 info.list에서 Main.Storyboard 정보를 지우고 코드로 직접생성해주어야 합니다.
iOS13이전이라면 AppDelegate에서, 이후라면 SceneDelegate에서 application(_:didFinishLaunchingWithOptions:), scene(_:willConnectTo:options)와 같은 앱의 수명주기 초기에 실행되는 메서드내에서 설정을 해주면 됩니다. Window객체를 생성해주고 self.window객체에 rootViewController를 설정해주어야합니다. 왜냐하면 Window객체는 그저 view를 보여주는 컨테이너역할이기때문에 rootVC를 만들고 설정해주어야 하는것이죠
다음으로 window.makeKeyAndVisible 메서드를 실행해줍니다.

# makeKeyAndVisible()메서드는 어떤역할인가요?

🔑 핵심키워드: window표시 및 keyWindow설정
📋 스크립트: window를 표시해주고 Key window로 설정을 해줍니다. 이때 window를 표시해주는건 내부적으로 isHidden을 false로 설정하여 창을 보여줍니다.

https://developer.apple.com/documentation/uikit/uiwindow/1621601-makekeyandvisible

# keyWindow란 무엇인가요 ? ✍️

🔑 핵심키워드: 가장먼저 터치이벤트를 처리, Deprecated됨, iOS13이전에서만 사용가능
📋 스크립트: keyWindow란 UIWindow들 중에서 가장 먼저 터치 이벤트와 같은 메시지를 처리할 window를 의미합니다. 그리고 여러개의 window가 존재할때는 하나만의 keyWindow만 존재하구요 하지만 현재는 Deprecated된 상태이기때문에 iOS13이전 버전에서만 사용이 가능합니다.

https://developer.apple.com/documentation/uikit/uiapplication/1622924-keywindow
https://ios-development.tistory.com/1011#:~:text=keyWindow%EB%9E%80%20UIWindow%EB%93%A4%20%EC%A4%91%EC%97%90%EC%84%9C%20%EA%B0%80%EC%9E%A5%20%EB%A8%BC%EC%A0%80%20%ED%84%B0%EC%B9%98%20%EC%9D%B4%EB%B2%A4%ED%8A%B8%EC%99%80%20%EA%B0%99%EC%9D%80%20%EB%A9%94%EC%8B%9C%EC%A7%80%EB%A5%BC%20%EC%B2%98%EB%A6%AC%ED%95%A0%20window%EB%A5%BC%20%EC%9D%98%EB%AF%B8

# 어떤 경우에 window를 사용하나요 ?

🔑 핵심키워드: 앱콘텐츠를 화면에표시
📋 스크립트:

  • 앱의 콘텐츠를 화면에 표시해야할때
  • 추가적으로 콘텐츠를 화면에 띄워야할때(필요에따라)
    window공식문서를 살펴보면 스토리보드를 표시할떄 Window프로퍼티를 사용한다고 나와있습니다. 기본적으로 스토리보드로 화면을 구현할때는 window가 자동으로 생성이됩니다. 만일 코드로 화면을 구현할 경우 window를 직접 생성해주어야 하는데요 이 경우에도 사용한다고 볼 수 있습니다.

추가적으로 또 몇가지 다른 작업을 위해 window객체를 사용합니다.

  • z축 level을 설정할때 (https://zeddios.tistory.com/567) ex) 여러앱들을 드래그해서 삭제할때의 화면이 필요하니 그럴때 Window가 생성되지않을까 ?
  • 좌표 값을 window좌표계로 변환하거나, window 좌표계에서 변환할때
  • rootViewController를 변경할떄
  • 표시되는 화면을 변경할때

https://developer.apple.com/documentation/uikit/uiwindow

# UIWIndow는 subclass를 할 수도 있나요 ?

🔑 핵심키워드: becomeKey() or resignKey()
📋 스크립트: 공식문서를 확인해보니 거의 서브클래스할 경우가 없다고 확인했습니다. 왜냐하면 window에서 구현할 수 있는 종류의 동작은 일반적으로 뷰컨에서 더쉽고 높은 수준으로 구현할 수 있기때문입니다. 하지만 서브클래스를 만들 수 있으며 두가지 경우에 서브클래싱을 합니다. 하나는 창의 key상태가 변경될때 직접 동작을 구현하고자 할때 할 수 있습니다. 또 하나는

https://developer.apple.com/documentation/uikit/uiwindow
https://velog.io/@yohanblessyou/%EC%9E%91%EC%84%B1%EC%A4%91-window%EA%B4%80%EB%A0%A8

# UIWindow는 view의 계층에서 가장 상위에 있다고 했는데 그러면 UIView는 UIWIndow의 하위클래스인가요? 그렇게 생각한 이유는 무엇인가요 ?


https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/WindowsandViews/WindowsandViews.html#//apple_ref/doc/uid/TP40009503-CH2-SW1

🔑 핵심키워드: UIWindow는 UIView를 상속받음, UIView는 UIWindow의 하위클래스가 아니다.
📋 스크립트:
아니요! 그렇지 않습니다.
대부분의 iOS앱은 모든 view들의 컨테이너 역할을하는 UIWindow인스턴스를 하나 가지는데 UIWindow는 UIView의 하위클래스이므로 Window는 그 자체가 View라고 할 수 있습니다.

실제로 공식문서를 통해서 UIView를 상속받고 있는것을 볼 수 있습니다.
정리하자면 view 계층의 가장 상위에 위치해 있지만 UIWindow는 UIView를 상속받고 있기때문에 하위클래스는 아닙니다!

https://zeddios.tistory.com/283