2023. 5. 28. 15:28ㆍiOS 개발/UiKit
ViewController란 ?
Swift와 iOS 개발에서 UIKit 프레임워크에 속하는 클래스로 화면의 상태와 동작을 관리
iOS 앱에서 각 화면은 일반적으로 하나의 ViewController와 연결됩니다.
ViewController는 UIKit의 UIViewController 클래스를 상속받아 작성되며,
앱의 화면에 해당하는 모든 구성 요소를 처리하고 제어합니다.
ViewController는 다음과 같은 역할을 수행합니다.
- 뷰의 로드 및 초기화
- 사용자 입력 처리
- 데이터 관리 및 로직 처리
- 애니메이션 및 화면 전환 관리
- 다른 ViewController와의 통신 및 데이터 전달
ViewController는 뷰의 LifeCycle 이벤트를 처리하고, 해당 뷰가 화면에 나타나거나 사라질 때 필요한 작업을 수행합니다.
ViewController의 LifeCycle이란?
ViewController 객체가 생성되고 화면에 나타나고 사라질 때까지의 주요 이벤트와 메서드 호출 순서를 말합니다.
ViewController의 LifeCycle을 잘 활용하면 앱의 화면 동작을 세밀하게 제어하고, 필요한 작업을 적절한 시기에 수행할 수 있습니다. 이를 통해 사용자 경험을 향상시키고 앱의 성능 및 안정성을 향상시킬 수 있습니다.
다음 코드는 UIkit으로 프로젝트를 생성할때 ViewController.swift에 자동으로 생성되는 코드입니다.
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
이 코드가 바로 LifeCycle의 초기부분입니다.
여기에 코드를 추가해 전체적인 LifeCycle 구조에 대해 알아보겠습니다.
import UIKit
class ViewController: UIViewController {
//ViewController의 뷰가 메모리에 로드된 후에 호출
override func viewDidLoad() {
super.viewDidLoad()
print("View did load")
}
//ViewController의 뷰가 화면에 나타나기 직전에 호출
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("View will appear")
}
//ViewController의 뷰가 화면에 나타난 후에 호출
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("View did appear")
}
//ViewController의 뷰가 화면에서 사라지기 직전에 호출
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print("View will disappear")
}
//ViewController의 뷰가 화면에서 완전히 사라진 후에 호출
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
print("View did disappear")
}
//메모리 부족 상황에서 호출
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
print("Memory warning")
}
}
1. viewDidLoad()
ViewController 객체의 초기 설정 및 추가 작업을 수행하기 위해 사용
//ViewController의 뷰가 메모리에 로드된 후에 호출
override func viewDidLoad() {
super.viewDidLoad()
print("View did load")
}
- 데이터 초기화: 화면에 표시될 데이터를 초기화하고 준비합니다. 예를 들어, 네트워크 요청을 통해 데이터를 가져와서 초기화하는 작업을 수행할 수 있습니다.
- UI 구성: 뷰 컴포넌트의 속성, 레이아웃, 스타일 등을 설정합니다. 예를 들어, 버튼의 타이틀, 라벨의 텍스트, 텍스트 필드의 델리게이트 등을 설정할 수 있습니다.
- 추가적인 설정: ViewController와 관련된 설정을 수행합니다. 예를 들어, 옵저버 등록, 제스처 인식기 설정, 데이터 모델에 대한 초기화 등을 수행할 수 있습니다.
2. viewWillAppear()
화면 전환이 발생하거나 현재 화면이 다시 표시될 때 필요한 작업을 수행하기 위해 사용
//ViewController의 뷰가 화면에 나타나기 직전에 호출
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("View will appear")
}
- 화면 전환 준비: 다른 화면으로 전환되기 전에 필요한 준비 작업을 수행합니다. 예를 들어, 다음 화면에 전달할 데이터를 준비하거나 화면 상태를 업데이트할 수 있습니다.
- 애니메이션 효과: 화면이 전환될 때 애니메이션 효과를 추가합니다. 예를 들어, 화면이 나타날 때 페이드 인 애니메이션을 적용하거나 객체들을 이동시키는 애니메이션을 수행할 수 있습니다.
- 데이터 업데이트: 다른 화면에서 돌아올 때 화면을 업데이트하거나, 외부 데이터의 변경에 따라 화면을 동적으로 갱신합니다. 예를 들어, 네트워크 요청에 응답하여 데이터를 다시 로드하거나, 사용자가 설정을 변경한 경우 해당 설정을 적용할 수 있습니다.
3. viewDidAppear()
화면이 완전히 보여진 상태에서 추가적인 작업을 수행하기 위해 사용
//ViewController의 뷰가 화면에 나타난 후에 호출
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("View did appear")
}
- 애니메이션 시작: 화면이 나타난 후에 애니메이션 효과를 시작합니다. 예를 들어, 페이드 인 애니메이션을 실행하거나, 객체들을 움직이거나 변형시키는 애니메이션을 수행할 수 있습니다.
- 외부 데이터 업데이트: 화면이 나타난 후에 외부 데이터를 다시 로드하거나 업데이트합니다. 예를 들어, 네트워크 요청을 통해 최신 데이터를 가져오거나, 다른 화면에서 변경된 데이터를 반영합니다.
- 타이머 시작: 화면이 나타난 후에 타이머를 시작하여 주기적인 작업을 수행할 수 있습니다. 예를 들어, 화면에 실시간 데이터를 표시하거나 자동으로 업데이트하는 경우에 사용할 수 있습니다.
4. viewWillDisappear()
다른 화면으로 전환되거나 현재 화면이 해제될 때 필요한 정리 작업이나 데이터 저장 등을 수행하기 위해 사용
//ViewController의 뷰가 화면에서 사라지기 직전에 호출
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print("View will disappear")
}
- 데이터 저장: 현재 화면에 변경된 데이터를 저장하거나, 사용자 입력을 처리하여 데이터를 업데이트합니다. 예를 들어, 폼 입력 데이터를 저장하거나 설정 변경을 반영하는 작업을 수행할 수 있습니다.
- 네트워크 요청 중단: 화면이 사라지기 전에 진행 중인 네트워크 요청을 취소하거나 일시 중지할 수 있습니다. 예를 들어, 화면이 전환되는 동안 불필요한 네트워크 요청을 중단시키는 작업을 수행할 수 있습니다.
- 정리 작업: 화면에서 사용한 리소스를 정리하거나 해제합니다. 예를 들어, 옵저버 등록 해제, 타이머 중지, 메모리 해제 등의 작업을 수행할 수 있습니다.
5. viewDidDisappear()
화면이 완전히 사라진 후에 추가 작업을 수행하기 위해 사용
//ViewController의 뷰가 화면에서 완전히 사라진 후에 호출
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
print("View did disappear")
}
- 리소스 해제: 화면이 사라진 후에 사용한 리소스를 해제합니다. 예를 들어, 메모리 관련 리소스를 정리하거나 객체를 해제하는 작업을 수행할 수 있습니다.
- 애니메이션 정리: 화면이 사라진 후에 실행 중인 애니메이션을 정리하거나 중지합니다. 예를 들어, 화면 전환에 사용한 애니메이션이 종료되었을 때 애니메이션 객체를 정리하는 작업을 수행할 수 있습니다.
- 데이터 초기화: 화면이 사라진 후에 초기화 작업을 수행합니다. 예를 들어, 화면이 다시 나타날 때 초기 상태로 되돌리거나, 다음 화면 전환을 위해 데이터를 초기화하는 작업을 수행할 수 있습니다.
6. didReceiveMemoryWarning()
메모리 부족 상황에서는 시스템이 앱에 경고 메시지를 보내고 추가적인 메모리를 확보하기 위해 앱에 대한 처리를 요청
//메모리 부족 상황에서 호출
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
print("Memory warning")
}
- 캐시 해제: 메모리를 확보하기 위해 사용하지 않는 캐시를 해제합니다. 예를 들어, 이미지나 동영상 등의 큰 데이터를 캐싱하고 있다면, didReceiveMemoryWarning()에서 해당 캐시를 비워 메모리를 확보할 수 있습니다.
- 임시 데이터 삭제: 임시적으로 저장한 데이터를 삭제하여 메모리를 확보합니다. 예를 들어, 화면 전환 시 임시로 저장한 데이터가 있을 경우, 해당 데이터를 제거할 수 있습니다.
- 불필요한 리소스 해제: 사용하지 않는 리소스를 해제하여 메모리를 확보합니다. 예를 들어, 화면 전환 시 사용하지 않는 뷰 컴포넌트나 객체를 해제할 수 있습니다.
마지막으로 면접에 나올만한 질문 3가지를 만들어 봤습니다.
Q: viewDidLoad()와 viewWillAppear()의 차이점은 무엇인가요?
A: viewDidLoad()는 ViewController의 뷰가 처음으로 메모리에 로드될 때 호출되는 메서드로, 초기 설정이나 데이터 로딩과 같은 작업을 수행합니다.
반면에 viewWillAppear()는 ViewController의 뷰가 화면에 나타나기 직전에 호출되는 메서드로, 화면이 나타나기 전에 필요한 설정 작업이나 데이터 업데이트를 수행하는 데 사용됩니다.
Q: viewWillDisappear()와 viewDidDisappear()의 차이점은 무엇인가요?
A: viewWillDisappear()는 ViewController의 뷰가 화면에서 사라지기 직전에 호출되는 메서드로, 다른 화면으로 전환되거나 현재 화면이 해제될 때 필요한 정리 작업이나 데이터 저장 등을 수행하는 데 사용됩니다.
반면에 viewDidDisappear()는 ViewController의 뷰가 화면에서 사라진 후에 호출되는 메서드로, 화면이 완전히 사라진 후에 추가 작업을 수행하는 데 사용됩니다.
Q: viewDidAppear() 메서드는 언제 호출되고 어떤 작업에 주로 사용되나요?
A: viewDidAppear() 메서드는 ViewController의 뷰가 화면에 나타난 후에 호출되는 메서드입니다.
이 메서드는 화면이 완전히 보여진 상태에서 추가적인 작업을 수행하는 데 사용됩니다.
주로 애니메이션 시작, 외부 데이터 업데이트, 타이머 시작 등에 활용됩니다.