안녕하세요! 피피아노입니다 🎵
이번 포스팅에서는 UIKit에서 사용되는 UIViewController에 대해서 정리를 해보려고 합니다.
그럼 바로 시작하겠습니다!
UIViewController란?
UIViewController는 UIKit의 핵심 클래스 중 하나로, 뷰 계층 구조를 관리하는 객체입니다. UIViewController는 사용자 상호작용을 처리하고 데이터를 관리하게 되는데 MVC 패턴에서 C에 해당하는 Controller를 담당하고 있습니다.
UIViewController는 iOS 앱의 화면 단위를 구성하며, 각 화면의 로직과 시각적 요소를 모두 관리합니다.
UIViewController의 주요 역할
UIViewController의 주요 역할은 크게 4가지로 정리할 수 있는데
첫 번째로 뷰관리, 두 번째 데이터 관리, 세 번째 사용자 상호작용 처리, 네 번째 화면 전환 관리 이렇게 정리할 수 있습니다.
iOS앱의 모든 화면은 UIViewController 또는 그 하위 클래스로 관리됩니다. 단일 책임 원칙에 따라 하나의 뷰 컨트롤러는 앱의 한 기능 영역만 담당하는 것이 좋습니다.
UIViewController - 뷰 관리
- 뷰 계층 구조의 루트 뷰(View 프로퍼티) 관리
- 뷰의 레이아웃 및 서브 뷰 구성
- 뷰의 생명주기 관리
UIViewController - 데이터 관리
- 모델 데이터와 뷰 사이의 중재자 역할
- 데이터를 뷰에 표시하고 업데이트
- 사용자 입력에 따른 데이터 변경 처리
UIViewController - 사용자 상호작용 처리
- 터치 이벤트, 제스처 등의 사용자 입력 처리
- 입력에 따른 UI변경 및 피드백 제공
UIViewController - 화면 전환 관리
- 다른 뷰 컨트롤러로의 전환 관리
- 네비게이션 컨트롤러, 탭 바 컨트롤러와의 상호작용
UIViewController의 생명 주기
생명주기는 뷰 컨트롤러가 생성되고 화면에 표시되며 사라지기까지의 전체 과정을 나타내는 것입니다. 각 단계마다 특정 메서드가 자동으로 호출되어 개발자가 적절한 작업을 수행할 수 있도록 합니다.

viewDidLoad: 뷰가 메모리에 로드된 후 호출, ex) 초기 데이터 로딩 및 네트워크 요청 설정 등
viewWillAppear: 뷰가 화면에 나타나기 직전에 호출, ex)네트워크 요청, UI 업데이트 등
viewDidAppear: 뷰가 화면에 나타난 후 호출, ex) 백그라운드 작업 및 애니메이션 등
viewWillDisappear: 뷰가 화면에서 사라지기 직전에 호출, ex) 데이터 저장, 작동 중인 기능 중지
viewDidDisappear: 뷰가 화면에서 사라진 뒤에 호출, ex) 메모리 정리 및 백그라운드 작업 중지
뷰 컨트롤러 간 데이터 전달 방법
뷰 컨트롤러 간 데이터 전달은 크게 3가지 방식으로 이루어집니다.
첫 번째로는 속성(Property)을 통한 전달이 있습니다.
// 첫 번째 뷰 컨트롤러에서
let nextScreen = DetailViewController()
nextScreen.messageData = "안녕하세요"
show(nextScreen, animated: true)
두 번째 방법은 세그웨이(segue)를 통한 전달이 있습니다.
// 첫 번째 뷰 컨트롤러에서
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showDetailSegue" {
if let destinationVC = segue.destination as? DetailViewController {
destinationVC.messageData = "안녕하세용"
}
}
}
핵심 부분은 prepare(for: sender:) 메서드를 사용하는 것인데 스토리보드에서 생성한 segue가 실행되기 직전에 호출되며, 다음 화면으로 데이터를 전달하는 역할을 합니다.
마지막으로 세 번째 방법은 델리게이트(Delegate)패턴을 활용하는 것입니다.
// 프로토콜 정의
protocol DetailViewDelegate: AnyObject {
func didUpdateData(_ data: String)
}
// 두 번째 뷰에서
weak var delegate: DetailViewDelegate?
// 데이터 전달 시점
delegate?.didUpdateData(textField.text ?? "")
이 코드에서는 DetailViewDelegate 프로토콜을 정의하고, 두 번째 뷰 컨트롤러에서 이 프로토콜 타입의 delegate 속성을 가집니다.
데이터를 전달할 때는 delegate의 메서드를 호출하여 첫 번째 뷰 컨트롤러로 데이터를 전달합니다.
첫 번째 뷰 컨트롤러는 이 프로토콜을 채택하고 구현하여 데이터를 받아 처리합니다. 이 패턴은 "역방향" 데이터 전달(자식->부모)에 유용합니다.
끝~~ :)
감사합니다.
잘못된 내용이 있거나 더 좋은 내용 피드백은 언제나 환영합니다!
궁금하신 부분은 댓글로 질문 부탁드립니다!
'Apple > UIKit' 카테고리의 다른 글
[UIKit] UIKit 톺아보기 (0) | 2025.03.16 |
---|