ViewController
날짜: 2024년 8월 21일
태그: Swift, UIKit, iOS
앱의 생명주기?
- 어떤 앱을 실행 중일 때 전화가 오는 상황을 가정해보자.
- 원래 실행 중이던 앱은..?
- 잠깐 비활성화 상태로
- 게임 중이던 모든 데이터는?
- 저장이 안되서 날아갈 수도 있음
앱의 실행(메모리에 올라감)부터 앱이 백그라운드로 / 앱의 종료까지를 포괄적으로 표현하는 개념
- 앱의 실행이 시작되서, 앱이 종료(메모리에서 내려감)되기까지의 주기가 존재
[그래서 왜 알아야 함?]
- (상태 변화의) 해당 시점에 호출되는 함수들이 있음
- 예시 ) 앱이 실행중이다가, 다른 앱으로 전환되는 시점에 (특정) 함수가 호출됨
- 게임 데이터 유지… etc 여러 상황에 사용 가능
ViewController의 생명주기
- 뷰 컨트롤러에도 생명주기가 존재
- 왜 필요할까?
- viewDidLoad(): StoryBoard에 있는 객체들과 코드에 있는 객체들이 실제로 연결되는 시점
- : 앱의 화면에 들어오면, 가장 먼저 실행시키는 함수
- 이는 내부적인 메커니즘
- 운영체제에 의해, 자동으로 호출되는 함수들이 존재

- 컨셉은 위와 같다.
- 각각에 대한 세부적인 기능은 아래와 같다.
생명주기 | 기능 |
loadView | - 뷰를 바꿀 수 있는 시점 - 뷰를 메모리에 올리는 과정 |
viewDidLoad | - 뷰가 생성 되었을 때 한번만 호출 - 스토리보드상의 뷰들과의 연결이 끝난 시점 - IBOutlet / IBAction등 연결이 끝난 이후 |
viewWillAppear | - 뷰가 화면에 나타날 때마다 계속 호출 - 실제 스크린 뷰가 나타나기 전에 호출 |
viewDidAppear | - 실제 스크린에 뷰가 나타난 후에 호출 - 애니메이션 시작, 타이머 앱 - 초 시작… |
viewWillDisappear | - 실제 스크린에 뷰가 사라지기 전에 호출 |
viewDidDisappear | - 실제 스크린에 뷰가 사라진 후에 호출 -메모리에서 없어진 것은 아님 |
(추가) viewIsAppearing | WWDC23 에서 소개된 viewIsAppearing -호출 후 뷰 컨트롤러의 뷰가 나타날 때마다 이 메소드를 호출 |
시뮬레이션

import UIKit
import SafariServices
class GameViewController: UIViewController {
// MARK: - 미션 요구사항, 뷰 컨트롤러 화면 관련 콜백 함수들에 print문 추가
override func viewDidLoad() {
super.viewDidLoad()
setUpNavigationBar()
print(#file, #line, #function, #column)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print(#file, #line, #function, #column)
}
override func viewIsAppearing(_ animated: Bool) {
super.viewIsAppearing(animated)
print(#file, #line, #function, #column)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print(#file, #line, #function, #column)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print(#file, #line, #function, #column)
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
print(#file, #line, #function, #column)
}
// MARK: - Setting Navigation Bar
// - prefersLargeTitles : 왼쪽 글짜 크게 설정
private func setUpNavigationBar() {
// Navigation Title 설정
navigationItem.title = "게임 설정"
navigationController?.navigationBar.prefersLargeTitles = true
}
// MARK: - 도움말 버튼 눌렀을 때
@IBAction func helpButtonTapped(_ sender: UIButton) {
openURL(urlString: "https://boostcamp.connect.or.kr")
}
// MARK: - openURL을 통해 Safari에 접근해서 원하는 url로 접근 가능
private func openURL(urlString: String) {
if let url = URL(string: urlString) {
let safariViewController = SFSafariViewController(url: url)
self.present(safariViewController, animated: true, completion: nil)
}
}
// MARK: - 초기화 버튼 눌렀을 때 showResetAlert가 호출
@IBAction func resetButtonTapped(_ sender: UIButton) {
showResetAlert()
}
// MARK: - 여기서 alert창 속성 정의. RESET의 경우 destructive로 설정
private func showResetAlert() {
let alert = UIAlertController(title: "게임 초기화", message: "모든 설정을 지우려고 합니다.\n다시 한 번 생각해보세요. 정말 지울까요?", preferredStyle: .alert)
let cancel = UIAlertAction(title: "Cancel", style: .default, handler: nil)
let reset = UIAlertAction(title: "RESET", style: .destructive, handler: nil)
alert.addAction(cancel)
alert.addAction(reset)
present(alert, animated: true, completion: nil)
}
}
- 위와 같은 코드에서 설정을 클릭했을 때 ‘설정에 해당되는 ViewController’에 대해 보려고 한다.
결과
1. (맨 처음) 탭바에서 설정을 클릭했을 때
.../BoostRaceGame/BoostRaceGame/GameViewController.swift 18 viewDidLoad() 40
.../BoostRaceGame/GameViewController.swift 23 viewWillAppear(_:) 40
.../BoostRaceGame/BoostRaceGame/GameViewController.swift 28 viewIsAppearing(_:) 40
.../BoostRaceGame/BoostRaceGame/GameViewController.swift 33 viewDidAppear(_:) 40
2. Safari로 앱을 전환했을 때
.../BoostRaceGame/BoostRaceGame/GameViewController.swift 38 viewWillDisappear(_:) 40
.../BoostRaceGame/BoostRaceGame/GameViewController.swift 43 viewDidDisappear(_:) 40
3. 다시 기존 앱으로 돌아왔을 때
.../BoostRaceGame/BoostRaceGame/GameViewController.swift 23 viewWillAppear(_:) 40
.../BoostRaceGame/BoostRaceGame/GameViewController.swift 28 viewIsAppearing(_:) 40
.../BoostRaceGame/BoostRaceGame/GameViewController.swift 33 viewDidAppear(_:) 40
ViewController 생명주기 컨셉

- View의 Drawing Cycle까지를 학습하면서 봐야 완벽히 이해가 되긴 하겠지만 ViewController 생명주기를 보기에도 좋은 그림이라 참조했다.
반응형
'iOS > UIKit' 카테고리의 다른 글
UIKit에서의 MVC (1) | 2024.09.12 |
---|---|
UITextFieldDelegate와 알아보는 Delegate Pattern (0) | 2024.08.22 |
UIKit이란? (0) | 2024.08.21 |
UIKit No.3 (0) | 2024.01.14 |
UIKit No.2 (0) | 2024.01.11 |
ViewController
날짜: 2024년 8월 21일
태그: Swift, UIKit, iOS
앱의 생명주기?
- 어떤 앱을 실행 중일 때 전화가 오는 상황을 가정해보자.
- 원래 실행 중이던 앱은..?
- 잠깐 비활성화 상태로
- 게임 중이던 모든 데이터는?
- 저장이 안되서 날아갈 수도 있음
앱의 실행(메모리에 올라감)부터 앱이 백그라운드로 / 앱의 종료까지를 포괄적으로 표현하는 개념
- 앱의 실행이 시작되서, 앱이 종료(메모리에서 내려감)되기까지의 주기가 존재
[그래서 왜 알아야 함?]
- (상태 변화의) 해당 시점에 호출되는 함수들이 있음
- 예시 ) 앱이 실행중이다가, 다른 앱으로 전환되는 시점에 (특정) 함수가 호출됨
- 게임 데이터 유지… etc 여러 상황에 사용 가능
ViewController의 생명주기
- 뷰 컨트롤러에도 생명주기가 존재
- 왜 필요할까?
- viewDidLoad(): StoryBoard에 있는 객체들과 코드에 있는 객체들이 실제로 연결되는 시점
- : 앱의 화면에 들어오면, 가장 먼저 실행시키는 함수
- 이는 내부적인 메커니즘
- 운영체제에 의해, 자동으로 호출되는 함수들이 존재

- 컨셉은 위와 같다.
- 각각에 대한 세부적인 기능은 아래와 같다.
생명주기 | 기능 |
loadView | - 뷰를 바꿀 수 있는 시점 - 뷰를 메모리에 올리는 과정 |
viewDidLoad | - 뷰가 생성 되었을 때 한번만 호출 - 스토리보드상의 뷰들과의 연결이 끝난 시점 - IBOutlet / IBAction등 연결이 끝난 이후 |
viewWillAppear | - 뷰가 화면에 나타날 때마다 계속 호출 - 실제 스크린 뷰가 나타나기 전에 호출 |
viewDidAppear | - 실제 스크린에 뷰가 나타난 후에 호출 - 애니메이션 시작, 타이머 앱 - 초 시작… |
viewWillDisappear | - 실제 스크린에 뷰가 사라지기 전에 호출 |
viewDidDisappear | - 실제 스크린에 뷰가 사라진 후에 호출 -메모리에서 없어진 것은 아님 |
(추가) viewIsAppearing | WWDC23 에서 소개된 viewIsAppearing -호출 후 뷰 컨트롤러의 뷰가 나타날 때마다 이 메소드를 호출 |
시뮬레이션

import UIKit
import SafariServices
class GameViewController: UIViewController {
// MARK: - 미션 요구사항, 뷰 컨트롤러 화면 관련 콜백 함수들에 print문 추가
override func viewDidLoad() {
super.viewDidLoad()
setUpNavigationBar()
print(#file, #line, #function, #column)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print(#file, #line, #function, #column)
}
override func viewIsAppearing(_ animated: Bool) {
super.viewIsAppearing(animated)
print(#file, #line, #function, #column)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print(#file, #line, #function, #column)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print(#file, #line, #function, #column)
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
print(#file, #line, #function, #column)
}
// MARK: - Setting Navigation Bar
// - prefersLargeTitles : 왼쪽 글짜 크게 설정
private func setUpNavigationBar() {
// Navigation Title 설정
navigationItem.title = "게임 설정"
navigationController?.navigationBar.prefersLargeTitles = true
}
// MARK: - 도움말 버튼 눌렀을 때
@IBAction func helpButtonTapped(_ sender: UIButton) {
openURL(urlString: "https://boostcamp.connect.or.kr")
}
// MARK: - openURL을 통해 Safari에 접근해서 원하는 url로 접근 가능
private func openURL(urlString: String) {
if let url = URL(string: urlString) {
let safariViewController = SFSafariViewController(url: url)
self.present(safariViewController, animated: true, completion: nil)
}
}
// MARK: - 초기화 버튼 눌렀을 때 showResetAlert가 호출
@IBAction func resetButtonTapped(_ sender: UIButton) {
showResetAlert()
}
// MARK: - 여기서 alert창 속성 정의. RESET의 경우 destructive로 설정
private func showResetAlert() {
let alert = UIAlertController(title: "게임 초기화", message: "모든 설정을 지우려고 합니다.\n다시 한 번 생각해보세요. 정말 지울까요?", preferredStyle: .alert)
let cancel = UIAlertAction(title: "Cancel", style: .default, handler: nil)
let reset = UIAlertAction(title: "RESET", style: .destructive, handler: nil)
alert.addAction(cancel)
alert.addAction(reset)
present(alert, animated: true, completion: nil)
}
}
- 위와 같은 코드에서 설정을 클릭했을 때 ‘설정에 해당되는 ViewController’에 대해 보려고 한다.
결과
1. (맨 처음) 탭바에서 설정을 클릭했을 때
.../BoostRaceGame/BoostRaceGame/GameViewController.swift 18 viewDidLoad() 40
.../BoostRaceGame/GameViewController.swift 23 viewWillAppear(_:) 40
.../BoostRaceGame/BoostRaceGame/GameViewController.swift 28 viewIsAppearing(_:) 40
.../BoostRaceGame/BoostRaceGame/GameViewController.swift 33 viewDidAppear(_:) 40
2. Safari로 앱을 전환했을 때
.../BoostRaceGame/BoostRaceGame/GameViewController.swift 38 viewWillDisappear(_:) 40
.../BoostRaceGame/BoostRaceGame/GameViewController.swift 43 viewDidDisappear(_:) 40
3. 다시 기존 앱으로 돌아왔을 때
.../BoostRaceGame/BoostRaceGame/GameViewController.swift 23 viewWillAppear(_:) 40
.../BoostRaceGame/BoostRaceGame/GameViewController.swift 28 viewIsAppearing(_:) 40
.../BoostRaceGame/BoostRaceGame/GameViewController.swift 33 viewDidAppear(_:) 40
ViewController 생명주기 컨셉

- View의 Drawing Cycle까지를 학습하면서 봐야 완벽히 이해가 되긴 하겠지만 ViewController 생명주기를 보기에도 좋은 그림이라 참조했다.
반응형
'iOS > UIKit' 카테고리의 다른 글
UIKit에서의 MVC (1) | 2024.09.12 |
---|---|
UITextFieldDelegate와 알아보는 Delegate Pattern (0) | 2024.08.22 |
UIKit이란? (0) | 2024.08.21 |
UIKit No.3 (0) | 2024.01.14 |
UIKit No.2 (0) | 2024.01.11 |