UIKit 앱의 뷰 계층을 관리하는 개체입니다.
- 한 개의 페이지는 반드시 한 개의 UIViewController 를 가짐.
- UIViewController 내부에 UIView, UIButton, UIScrollView 등 UIKit 의 UI 클래스들을 배치하며 화면을 구성한다.
- iOS 의 대표적인 생명주기 2가지
- 앱 생명주기 (App Lifecycle) → [1-3. Xcode 빌드] 강의에서 공부했음.
- ViewController 생명주기 (ViewController Lifecycle)
- ViewController Lifecycle
init - 생성자
leadView - 처음 가지는 뷰(무조건 있어야지 뷰가 생성된다)
viewDidLoad - 뷰가 메모리에 올려질때 사용( 이건 자주 봤을 것이다 뷰 컨트롤러 만들면 무조건 있는거니깐)
viewWillappear - 뷰가 유저에게 보이기 직전 단계라고 생각하면 된다.
viewISappearing - 뷰를 만들고 있다고 생각하면 된다.
viewDidappear - 실제 완전히 나타났다는 것이다. 즉 유저에게 보이는 보습이다.
자 여기까지가 뷰가 생성되는 과정이다.
그리고 만약 뷰 콘트롤러가 두개여서 버튼을 누르면
다음 화면으로 넘어가게 된다면??
그러면 어떻게 될 것이냐?
먼저 viewDidLoad 생성되고
viewWillDisappear - 이전 화면이 없어질거야 ~ 이러면서 화면을 없앨 준비를 하고
viewDidDisapper - 이제 완젼히 없어졌다 ~ 이렇게 나타난다.
자 그럼 다시 네비게이션을 만들면 자동으로 생성되는 Back 버튼을 누른다면
뷰의 생명주기는 어떻게 될 것인가?
첫번째 ViewDidLoad 먼저 나타날 것인가? 아니면 LoadView?
자 여기서 중요하다 ~
처음 viewDidLoad 호출하게 된다면 이미 뷰가 생성되어있어서 다시 재생성을 하지 않고
메모리에 올려져있게 된다.
그래서 다시 뒤로 돌아가게 된다면
viewWillAppear 호출 되며 차례대로 viewIsAppearing -> viewDidAppear 호출하게되서
사용자에게 보여지게 된다는 것이다 ~
import UIKit
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = scene as? UIWindowScene else { return }
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UINavigationController(rootViewController: ViewController())
window.makeKeyAndVisible()
self.window = window
}
// ...
}
그래서 맨처음 씬을 만들게 되면 이렇게 코드가 작성되게 된다.
예제로는 첫번째 화면
import UIKit
class ViewController: UIViewController {
let button = UIButton()
override func viewDidLoad() {
super.viewDidLoad()
configureUI()
print("viewDidLoad")
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("viewWillAppear")
}
override func viewIsAppearing(_ animated: Bool) {
super.viewIsAppearing(animated)
print("viewIsAppearing")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("viewDidAppear")
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print("viewWillDisappear")
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
print("viewDidDisappear")
}
private func configureUI() {
view.addSubview(button)
view.backgroundColor = .white
button.setTitle("페이지 이동", for: .normal)
button.addTarget(self, action: #selector(buttonTapped), for: .touchDown)
button.backgroundColor = .red
button.setTitleColor(.white, for: .normal)
button.titleLabel?.font = .boldSystemFont(ofSize: 30)
button.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
button.widthAnchor.constraint(equalToConstant: 200),
button.heightAnchor.constraint(equalToConstant: 120),
button.centerXAnchor.constraint(equalTo: view.centerXAnchor),
button.centerYAnchor.constraint(equalTo: view.centerYAnchor)
])
}
@objc
private func buttonTapped() {
self.navigationController?.pushViewController(AdamViewController(), animated: true)
}
}
두번째 화면
import UIKit
class AdamViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .orange
print("AdamViewController viewDidLoad")
}
}
아래 코드를 작성하게 되면 생명주기에 대해 조금더 이해하기 쉽다
override func viewWillAppear(_ animated: Bool) {
print("viewWillAppear")
self.view.backgroundColor = UIColor(
red: .random(in: 0...1),
green: .random(in: 0...1),
blue: .random(in: 0...1),
alpha: 1.0
)
self.button.backgroundColor = UIColor(
red: .random(in: 0...1),
green: .random(in: 0...1),
blue: .random(in: 0...1),
alpha: 1.0 // 투명도이니 잘 조절할 것
)
}
이렇게 하면 뷰생명주기를 콘솔창을 보면 잘 나오니 이해하기 쉬울 것이다. 그럼 안뇽
'코딩' 카테고리의 다른 글
swift 메모리 관리에 대해 공부해보자 (0) | 2024.07.16 |
---|---|
swift 캡처 참조 타입에 대해 배워보자(강한참조, 약한참조, 순환참조) (1) | 2024.07.16 |
swift 오버라이드 , 슈퍼 공부해보자 (0) | 2024.07.15 |
swift 스위치 버튼 비활성화 하기 ~ (0) | 2024.07.15 |
swift 네비게이션 화면 첫화면으로 돌아가는 코드 작성해보자 (1) | 2024.07.15 |