Skip to content

[week04] Singleton Pattern, View State Method

Daehoon Lee edited this page Jun 3, 2023 · 9 revisions

4주차 토요스터디 / 주제: Singleton Pattern, View State Method / (23.05.20)

Hemg, Hoon, Serena, BMO 최강홍대모이조~!

🔎 실험 1

  • 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를 생성해주는 것이다.

🔎 실험 2

  • 싱글톤에 대해서 알아 봤습니다.
  • 싱글톤으로 하나의 객체프로퍼티값을 같이 받아 값이 변환되는점을알아 봤습니다.
  • 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)
    }   
}
데이터변환 화면


📚 참고 링크