본문 바로가기

iOS

iOS(2) - 뷰(View), 윈도우(Window)란 무엇일까?

최근 '아론 힐리가스의 iOS 프로그래밍' 이라는 책을 보며 공부를 하고 있는데요. iOS 13부터 SceneDelegate가 추가되고 발생하는 오류들을 해결하지 못해 이것저것 찾아보다가 공부한 것에 대해 정리하기로 마음먹었습니다!  

먼저 AppDelegate와 SceneDelegate에 대해 알기전에 기본적인 지식들을 알아보야 할 것 같아 이번 시간에는 view와 window에 대해서 정리를 해보고 다음에는 AppDelegate와 SceneDelegate에 대해서  정리해보도록 하겠습니다!


View란 무엇일까??

View 객체는 앱의 사용자 인터페이스를 구성합니다!

 

  • View는 UIView의 인스턴스거나 UIView 하위 클래스의 인스턴스이다.
  • 자신을 어떻게 그리는지 알고 있다.
  • 터치와 같은 이벤트들을 처리할 수 있다.
  • 뷰 계층 구조상에 존재한다. 뷰 계층 구조의 루트는 앱의 윈도우 이다.(???)

흠 이렇게 뷰에 대해서 정리하다 보니 앱의 윈도우라는 말이 와 닿지 않아 UIWindow에 대해서 알아보았습니다.


윈도우(Window)란 무엇일까?

 

  • UIWindow의 정의는 나의 View 들에서 일어난 이벤트를 처리하고 사용자 인터페이스와 객체에 배경을 제공하는 것이다.
  • Window는 시각적인 모습을 가지고 있지는 않지만 앱 view 의 프레젠테이션에 중요하다.
  • 스크린에 나타나는 모든 view 들은 Window 로 묶여 있으며, 각 Window 는 앱의 다른 view 와 독립적 이다.
  • 앱에서 이벤트를 받았을 때 처음에 해당 View 객체로 라우팅(*) 되고 해당 이벤트는 해당 View로 전달이 된다. Window 는 ViewController를 이용하여 방향 변경을 구현합니다.
    • 라우팅 : 근원지에서 목적지로 데이터가 전달될 수 있도록 하는 기능

- > 전체적으로 한번 정리를 해보자면 iOS 앱은 모든 View 들의 컨테이너 역할을 하는 UIWindow 인스턴스를 가지는데 이는 AppDelegate(다음 시간에 정리하면 링크 남기겠습니다!!)에 정의되어 있으며 UIWindow 는 UIView 의 하위 클래스 이므로 Window 는 그 자체가 View 라고 할 수 있습니다!!

 

지금까지 View와 window에 대해서 알아보았는데요! 그렇다면  어떻게 window 객체를 만들 수 있을지에 대해 정리해볼게요~!


Window 객체를 만드는 방법

  • 메인 Window 객체는 프로그래밍 / 인터페이스 빌더 두 가지 방법으로 생성과 설정이 가능하며 AppDelegate 객체가 이것을 잡고 있어야 합니다. 
  • 이 객체는 백그라운드(Background)포그라운드(Foreground) 에 상관없이 실행될 때는 항상 생성해야 합니다! 그러나 추가적인 Window 객체는 그것이 필요할 때 생성돼도 됩니다. (Lazy created)
    • Foreground : 앱이 실행되어 사용자에게 보이고 있는 상태이고 오직 하나의 App 만 foreground 상태를 가질 수 있습니다!
    • Background: foreground 상태에서 HomeScreen으로 이동한 상태를 말합니다, Background 상태로 전환되기 전에 호출된 작업이 끝나지 않았다면 background 상태에서도 여전히 실행을 합니다.

그러면 이제 본격적으로 만드는 방법에 대해서 설명해보겠습니다!

  • 스토리보드로 할 때  : 스토리보드를 사용하실 때는 따로 Window를 만들어 보신 경험이 없으실 텐데요?! 자동으로 생성이 되기 때문입니다!!
  • 프로그래밍적으로 생성하는 방법

다음은 프로그래밍으로 생성하는 방법에 대해서 설명하겠습니다!

 

  1. 먼저 Main 으로 되어 있던 Info.plist 의 항목을 지워야 합니다! 프로젝트를 생성할 때 자동으로 Xcode는 Main.storyboard를 통해 메인 window 객체를 만들고 rootViewController 를 설정하게 되어 있습니다.
    • rootViewController : 현재 앱의 가장 밑 부분에 있는 Controller, 즉 앱을 켰을때 처음 실행되는 뷰 컨트롤러라고 생각하면 됩니다.

     

이 부분을 삭제해주시면 됩니다!!

  2. AppDelegate.swift 파일에 Window 객체를 생성하고 넣어주도록 합니다. (위에서 말씀드렸듯이 AppDelegate와 SceneDelegate는 곧 정리해서 올리도록 할게요!)

이렇게 Window 객체를 생성하시면 됩니다!!

3. 하지만 window 객체는 그저 뷰를 보여주는 컨테이너 역할이기 때문에 rootViewController를 만들고 설정해주셔야만 뷰가 제대로 나오는 것을 확인하실 수 있습니다!

 

4. rootViewController 를 만들고도 시뮬레이터에 검은 화면만 나온다면 이것은 window가 keyWindow가 아니기 때문입니다. 따라서 다음 코드를 작성해주셔야 합니다!

window.makeKeyAndVisible()

 

이렇게 window 객체를 코드로 생성해보는 것도 공부해보았는데요. 이렇게 보시는 것보다 직접 해보시는 것이 이해가 더 잘되니 한번 직접 해보시는 것도 추천드립니다!

 

다음은 뷰 계층구조에 대해서 정리해보도록 하겠습니다!!


뷰 계층구조(View hierarchy)

 

  • 앱이 실행되면 윈도우가 하나 만들어지고 윈도우에 다른 뷰들을 추가하는게 가능합니다.

  • 윈도우에 추가한 뷰를 윈도우의 하위 뷰(subview) 라고 한다.

  • 윈도우의 하위 뷰 또한 그것의 하위 뷰를 가질 수 있는데 그것을 윈도우를 루트로 한 뷰 객체들의 계층 구조 라고 할 수 있습니다.

이번에는 뷰 계층 구조에 대해 간단하게 정리해보았는데요. 이 내용에 대해서는 NavigationViewController 등을 정리할 때 조금 더 다룰 수 있다면 공부해보도록 할게요!! 

읽어주셔서 감사합니다 


오늘은.. 여기까지..