📖코드로 화면 전환

다음 View Controller가 코드로 구현되어 있는 경우

📎순서

1. 뷰 컨트롤러 객체(다음 화면) 생성

  • 데이터 전달

2. present()

  • 화면이동

📎코드

@IBAction func codeNextButtonTapped(_ sender: UIButton) {
    let firstVC = FirstViewController()
		 // 여기서 데이터 전달해~~
    present(firstVC, animated: true, completion: nil)
}

📖코드로 스토리보드 객체를 생성해 화면 이동

다음 View Controller가 스토리보드로 구현되어 있는 경우 storyboard와 코드를 연결시켜줘야 함

📎순서

1. 스토리보드를 통한 뷰 컨트롤러 객체 생성

  • 데이터 전달

2. present

  • 화면 이동

📎코드

@IBAction func storyboardWithCodeButtonTapped(_ sender: UIButton) {    
    if let secondVC = storyboard?.instantiateViewController(withIdentifier: "secondVC") as? SecondViewController {
        
				// 여기서 데이터 전달해~~
 
        present(secondVC, animated: true, completion: nil)
    }
}

📎주의할 점

코드로 화면 이동 방식과 같이 viewController의 instance를 생성해서 데이터를 전달하면 안되나요?

storyboard와 연결되지 않기 때문에 불가능

🔖 in 메모리

  • viewController instance
  • UI instance(storyboard로 UI 만들었을 시 heap 영역) storyboard로 UI를 짤 때는 viewController instance와 storyboard로 만든 UI instance가 메모리에 따로 있음 나중에 연결을 해줘야 함(ibOutlet 같이)

따라서, 코드로 화면 이동 방식과 같이 단순히 instance를 생성하는 것만으론 storyboard와 연결되지 않음!

🔖코드와 스토리보드는 언제 연결되나요? viewDidLoad()가 실행될 때 연결됨

📖 Segue(세그웨이)

storyboard-view Controller 사이의 연결 관계 및 화면전환을 관리

  • view Controller에 대한 정보 필요 X (  세그웨이가 스토리 상 연결 정보를 이용해 목적지인 뷰 컨트롤러의 인스턴스를 자동으로 만들어줌)

📖스토리보드에서의 화면 이동(간접 세그웨이)

간접적으로 세그웨이 연결 (현재 view controller-다음 view controller) 세그웨이를 실행할 메소드 호출 필요

📎순서

1. segue 만들기(스토리보드)

  • 화면 이동을 담당하는 객체

2. performSegue

  • 조건 설정 가능 (shouldPerformSegue와 비슷한 효과)

-자동호출→

3. prepare

항상 identifier확인필수

  • identifier 확인 → destination 접근 → data 전달

📎코드

@IBAction func storyboardWithSegueButtonTapped(_ sender: UIButton) {
		performSegue(withIdentifier: "toThirdVC", sender: self)
}
 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toThirdVC" {
        let thirdVC = segue.destination as! ThirdViewController
        
				// 여기서 데이터 전달해~~
    }
}

📖 스토리보드에서의 화면 이동(직접 세그웨이)

직접적으로 세그웨이 연결 (view-다음 view controller) 이벤트가 발생되면 자동으로 실행

📎순서

1. segue 만들기(스토리보드 - 직접연결)

  • 화면 이동을 담당하는 객체
  • view에서 직접 실행

-자동호출→

2. shouldPerformSegue

  • 조건에 따라 다음화면을 이동할지 말지 결정

-자동호출→

3. prepare

  • identifier 확인 → destination 접근 → data 전달

📎코드

// should → 허락한다/허락하지않는다라는 의미
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
 
    // 화면 이동 조건
 
    return true
}
 
// identifier 확인 → destination 접근 → data 전달
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toFourthVC" {
        let fourthVC = segue.destination as! FourthViewController
        
        fourthVC.someString = "뚜루루뚜뚜"
    }
}

📖돌아가기

dismiss(animated: true, completion: nil)

📖화면 간 데이터 전달

클래스나 구조체 등을 통해 간접적으로 전달

변수를 통해 간접적으로 데이터를 전달하는 이유는?

viewController.mainLabel.text = "직접전달중"

위의 코드와 같이 직접적으로 데이터 전달했을 경우, 아래와 같은 에러 발생 (해보고 나중에 첨부파일 첨부 노션에서 옮기면서 삭제됨 …ㅜ)

현재 mainLabel이 nil이야!! 즉, 메모리에 아직 mainLabel이 올라오지 않았는데(내부적으로 코드와 스토리보드가 연결되지 않았는데) 접근 중

🔖메모리에는 언제 올라가나요? 코드로 구현된 VC가 메모리에 올라감 → 스토리보드를 메모리에 올림 → 코드와 스토리보드를 연결

🔖코드와 스토리보드는 언제 연결되나요? viewDidLoad()가 실행될 때 연결됨

🔖 UI가 코드로 구현되어 있다면? 직접 전달이 가능하긴 함. 하지만 그냥 변수를 통해 전달하자!