-
Notifications
You must be signed in to change notification settings - Fork 0
[week04] Singleton Pattern, View State Method
Daehoon Lee edited this page Jun 3, 2023
·
9 revisions
Hemg
, Hoon
, Serena
, BMO
최강홍대모이조~!
- UIViewController LifeCycle에 대해서 알아보았습니다.
- 첫뷰 컨트롤러에서 화면이 나타날때 어떻게 호출되는지 loadView 에서 부터 화면 호출 관련 메소드에 대해서 알아 봤습니다.
- 첫번째 화면에서 두번째 화면 이동시에 뷰의 호출 순서가 어떻게 진행되는지 알아 봤습니다.
예제 코드
class MainViewController: UIViewController {
required init?(coder: NSCoder) {
super.init(coder: coder)
// fatalError("init(coder:) has not been implemented")
print("내가 바로 짜파게티 요리사")
}
// 추후 추가 예정입니다.
override func loadView() {
super.loadView()
print("응 오늘 토요일이야 너 짤렸어")
print("내가 2등이야")
}
override func viewDidLoad() {
super.viewDidLoad()
print("11111===== main viewDidLoad")
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("11111===== main viewWillAppear")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("11111===== main viewDidAppear")
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print("11111===== main viewWillDisappear")
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
print("11111===== main viewDidDisappear")
}
}
push 화면 | present 화면 |
---|---|
required init?(coder: NSCoder) {
super.init(coder: coder)
fatalError("init(coder:) has not been implemented")
}
이 초기화 메서드는 주로 인터페이스 빌더에서 클래스를 로드할 때 호출되는 경우에 사용됩니다. 예를 들어, 스토리보드에서 해당 클래스의 객체를 생성하거나 인터페이스 빌더에서 해당 클래스를 사용하는 커스텀 뷰를 로드할 때 이 초기화 메서드가 호출될 수 있습니다.(뷰컨을 생성하여 쓸때)
즉, required init?(coder: NSCoder)를 구현함으로써 인터페이스 빌더에서 해당 클래스를 사용할 수 있으며, 인터페이스 빌더에서 설정한 프로퍼티 값 등을 초기화하고 클래스의 초기 상태를 설정할 수 있게 됩니다.
- 스토리보드로 작성할 때 required init?(coder: NSCoder)은 필수적으로 필요한데, 단순히 스토리보드로만 뷰를 작성하거나 할 때는 선언할 필요가 없다 하지만 코드로 init을 넣어주게 된다면 이는 부모 클래스의 생성자들을 그대로 상속받지 않는다는 것이기 때문에 required init을 따로 생성해주어야 한다.
- 그래서 required init에 내가 넣어주고 싶은 정보를 넣으면 스토리보드를 찾고, 그 스토리보드의 xml 형태 파일을 찾고, 이 두가지를 내가 넣어주고 싶은 정보와 함께 넣어서 이 view controller를 생성해주는 것이다.
- 싱글톤에 대해서 알아 봤습니다.
- 싱글톤으로 하나의 객체프로퍼티값을 같이 받아 값이 변환되는점을알아 봤습니다.
- viewWillAppear, didSet 을 사용하여 버튼을 누르지 않아도 값이 변경되는것을 받을수 있게 진행했습니다.
예제 코드
class PointManager {
static let shared = PointManager()
var point: Int = 50 {
didSet {
NotificationCenter.default.post(name: Notification.Name("didSetPoint"), object: nil)
}
}
private init() {}
}
class MainViewController: UIViewController {
@IBOutlet weak var numberLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
print("11111===== main viewDidLoad")
configureLabel()
NotificationCenter.default.addObserver(self, selector: #selector(configureLabel), name: Notification.Name("didSetPoint"), object: nil)
}
@IBAction func resetButton(_ sender: UIButton) {
configureLabel()
}
@objc func configureLabel() {
numberLabel.text = "\(PointManager.shared.point)"
}
}
class BuyingViewController: UIViewController {
@IBAction func secondDismissButton(_ sender: UIButton) {
PointManager.shared.point -= 1
dismiss(animated: true)
}
}
데이터변환 화면 |
---|