본문 바로가기
모바일앱/알려줘_IOS

View뜯어보기 (1)

by GeekCode 2022. 3. 15.
반응형

View

View & Window

View란 앱의 사용자 인터페이스를 구성한다.

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

iOS 앱은 모든 View 들의 컨테이너 역할을 하는 UIWindow 인스턴스 를 가지는데 이는 AppDelegate에 정의되어 있으며(SceneDelegate를 사용하는 경우는 SceneDelegate에 정의)

UIWindow 는 UIView 의 하위 클래스 이므로 Window 는 그 자체가 View라고 할 수 있다.

최초의 window는 스토리보드를 사용할 때는 자동으로 생성이 되지만 코드로 구현할 때는

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

  1. AppDelegate.swift 파일에 Window 객체를 생성하고 넣어주도록 한다.
  2. var window: UIWindow? window = UIWindow.init(frame: UIScreen.main.bounds)
  3. window 객체는 그저 뷰를 보여주는 컨테이너 역할이기 때문에 rootViewController를 만들고 설정해야만 뷰가 제대로 나오는 것을 확인할 수 있다
  4. rootViewController 를 만들고도 시뮬레이터에 검은 화면만 나온다면 이것은 window가 keyWindow가 아니기 때문
  5. window.makeKeyAndVisible()

뷰의 계층구조(View hierarchy)

  • 앱이 시작되면 윈도우가 생성되고 그 윈도우에 다른 뷰들을 추가하는게 가능해진다.
  • Window에 추가한 View들을 Window의 하위뷰 (subView)라고 한다.
  • Window의 SubView들은 자신의 SubView를 가질 수 있는데 그것들이 Window를 root로 한 뷰객체들의 계층구조라고 할 수 있다.

ViewController

  • MVC(Model-View-Controller) 디자인 패턴에서, View Controller는 스크린에 나타나는 정보를 보여주는 View 객체와 앱의 콘텐츠를 저장하는 data 객체를  관리한다.
  • 이 중 ViewController는 뷰 계층과 해당 뷰들을 최신 상태로 유지하는데 필요한 정보를 관리하는 역할을 하게 된다.
  • 모든 UIKit은 앱의 콘텐츠를 표시하기 위해 View Controller에 크게 의존하며 뷰와 UI 관련 로직을 관련하기 위해 Custom View Controller를 자주 정의하게 된다. (UIKIt이란 UI를 담당하는 프레임워크를 말한다!)
  • 우리가 생성한 Custom View Controller의 대부분은 View Controller가 모든 뷰를 소유하고 다른 뷰들과의 상호 작용을 관리하는 Content View Controller 다. 이때 자신의 모든 View들을 ViewController가 스스로 관리한다.

 

ViewController에 View추가

  • UIViewController는 뷰 계층 구조에서 root view 역할을 하고 view property를 통해 접근할 수 있는 content view를 포함하고 있다.
  • 이 root view에서는 인터페이스에 보여줘야 할 필요한 custom view를 추가하는 것이 가능하다
  • 스토리보드에서 추가하기 위해서는 View Controller에 드래그 함으로써 뷰를 추가할 수 있다
  • UIButton이나 UIImageView 등 모든 View들이 들어가는 View를 rootView라고 한다.
  • 스토리보드에서 구현하는 경우는 AutoLayout을 통해 사이즈와 위치를 지정해 주어야 빌드했을 때 보여진다.

Store References to Important Views

앱을 실행할 때 ViewController의 코드에서 View에 접근하게 된다.

  • View계층에서 View를 참조하기위해서는 ViewController의 Property인 outlet을 사용해 접근한다.
  • outlet키워드를 통해 스토리보드에서 해당 프로퍼티를 인지한다.
  • 모든 View요소들을 추가하지 않아도되고 앱실행중 업데이트가 필요한 요소들만 참조해도 된다.
  • 몇 몇 View요소는 Protocol을 준수해야하는 경우도 있다.

Handle Event Occuring in Views ans Controls

  • ViewController가 이벤트의 발생을 알기 위해서는 View와의 상호작용을 알 수 있는 방법을 사용해야한다.
    • ViewController에 Action Method 혹은 Delegate를 구현한다.
    • ViewControlle의 extension을 이용하여 Action Method 혹은 Delegate를 구현한다.
    • → 이벤트처리하는 코드로 분리하면서 해당코드의 유효성 테스트가 용이
    • 전용 객체를 만들어 Delegate와 ActionMethod를 분리하여 관련 정보를 ViewController로 전달하는 방법
    • → 유연성과 재사용성에 좋음

Prepare Your Views to Appear Onscreen

UIKit은 화면에 View를 표시할 때, 다음과 같은 순서로 해당 View를 로드하고 구성한다.

  1. 해당뷰의 init(coder:) 메서드를 사용하여 객체 생성
  2. ViewController에서 해당하는 action 및 outlet을 View에 연결한다.
  3. 각 View와 ViewController의 awakeFromNib() 메서드를 호출한다.
  4. * awakeFromNib() 메소드의 경우는 View가 호출되고 해당하는 subview가 할당되고 초기화 됐을때 호출.
  5. ViewController의 View property에 View 계층을 할당한다.
  6. View의 생명주기에 따른 메서드를 호출한다.

ViewController Type

ViewController는 두가지 타입이 존재한다.

  • Content ViewController Type:
  • Container ViewController Type: NavigationViewController / TabBarViewController 처럼 여러개의 ViewController를 제어하는 ViewController
  • Content ViewController Type
    • 일반적인 interface요소로 사용하는 ViewController
    • 앱의 contents의 일부분을 관리 혹은 자신의 모든 View는 스스로 관리한다. (Design Pattern에 따라다름)
  • Container ViewController Type
    • NavigationViewController / TabBarViewController 처럼 여러개의 ViewController를 제어하는 ViewController
    • 다른 ViewController들로부터 정보를 모은다.
    • 자신의 View들과 자식ViewController들의 rootView들을 관리한다.
    • 직접 자식ViewController의 Contents를 관리하지는 않고 rootView의 크기조저로가 위치조절에 대해서만 관리

ViewController 간의 연동

  • ViewController에는 생명주기가 존재한다.
  • ViewController사이에서는 전환이 가능하고 이전 ViewController의 View가 유지가 될수도 , 안될 수도 있다.
  • 그 해당시점을 이벤트화하여 생명주기에 따른 메서드를 지정할 수 있다.
반응형

'모바일앱 > 알려줘_IOS' 카테고리의 다른 글

Delegate 패턴  (0) 2022.02.18
swift - Boolean  (0) 2022.02.10
swift - 튜플  (0) 2022.02.08
Swift - 코멘트 처리하기  (0) 2022.02.07
Xcode 세팅하기  (0) 2022.02.06
알려줘_IOS 시리즈 서문  (0) 2022.02.05