ViewController는 iOS 앱 개발에서 빼놓을 수 없는 요소이다. 구조적으로 어떻게 구성되었는지 알아보고, 어떤 life cycle을 가지는지 이해해보자. 그럼 시작하자.

ViewController

  • View management model
  • 역할
    • view 구성
    • view event 처리
    • data를 view와 연결
  • templates
    class ViewController: UIViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
            // VC내부에 property로 있는 view가 화면에 보이기 위해 load 되었을 때 호출됨
            // VC 생성 시점과 view가 보이는 시점은 차이가 있음
        }
     
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // App이 메모리 부족 경고를 받을 경우 호출됨
        }
    }
    • 메모리 관리는 AppDelegate에서도 가능

초기화

// code
public init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)
 
// storyboard
public init?(coder: NSCoder)
  • parameter
    • nibName: nib 파일명
    • bundle: nib파일이 있는 Bundle(NSBundle) 객체
    • UIViewController.init()인 경우 nil로 넘어옴
  • 활용
    class ViewController: UIViewController {
        override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
            super.init(nibName: nibNameOrnil, bundle: nibBundleOrNil)
     
            // 초기화 코드 작성
            // 해당 시점에는 view가 없음
            // view와 관계없는 object 초기화 용도로 좋음
        }
    }
     
    class ViewController: UIViewController {
        required init?(coder: NSCoder) {
            super.init(coder: coder)
     
            // 상등
        }
    }

Life Cycle

  1. init
  2. loadView
  3. viewDidLoad
  4. viewWillAppear
  5. viewDidAppear
  6. viewWillDisappear
  7. viewDidDisappear
  8. deinit

LoadView

  • view에 대한 customizing 작업
  • 구현하지 않아도 기본적으로 view가 생성되어 load됨
override func loadView() {
    let view = UIView(frame: UIScreen.main.bounds) // 스크린 크기에 맞춘 view 생성
    view.backgroundColor = UIColor.green
    view.autoresizingMask = [.flexibleWidth, .flexibleHeight] // window의 크기 변경에 맞춰 변하도록 설정
    self.view = view
}

주의사항

  • init method에서 view에 접근하면 위험함
    • 초기화 작업 중에 viewDidLoad가 호출될 수 있음
    • method 호출 순서가 달라져 버그 발생위험 있음
    • 일반적인 상황
      • viewController가 사용되기 시작할 때 호출됨
    • init method에서 접근
      • view 생성, 초기화 과정에서 호출됨

Container View Controller

  • UIViewController 하위에 ChildViewController를 둘 수 있음
  • 기능에 따라 ViewController를 분리 후, Container ViewController에 모아서 보여줄 수 있음
  • 동일한 생명주기를 가짐

정리

  • UIWindow위에 rootViewController가 올라간다.
  • ViewController에서는 ChildViewController를 가진다.
  • 추가적으로 다른 창을 띄울수도 있고(modal) 이는 presentedViewController로 접근 가능하다.

Reference