[iOS] 화면 이동과 데이터 전달

Bettor·2023년 1월 9일
0
  1. 다음 화면이 코드로만 작성된 경우
    : 다음 화면의 UI와 기능을 코드로 구현 후, 메인뷰에서 다음 화면으로 넘어가기 위해 만든 버튼을 메인 뷰컨트롤러에 IBAction으로 연결하여서 firstVC란 저장공간을 만들어 FirstViewController의 접근을 허용하고 present로 다음 화면으로 넘긴다.
let firstVC = FirstViewController()
self.present(firstVC, animated: true, completion: nil)
  1. 다음 화면을 스토리보드로 구현한 경우
    : 다음 화면을 스토리보드로 구현 후, 위처럼 메인뷰에서 버튼을 뷰컨에 IBAction으로 연결하여 에러 발생을 막기 위해 guard let으로 저장 공간을 허용하여 다음 화면으로 넘긴다.
guard let secondVC = storyboard?.instantiateViewController(withIdentifier: "secondVC") as? SecondViewController else { return }
        //secondVC.someString = "안녕하세요"
        //secondVC.mainLabel.text = "안녕하세요"    // 에러발생 (스토리보드 객체가 나중에 생김)
        //secondVC.modalPresentationStyle = .fullScreen
self.present(secondVC, animated: true, completion: nil)
  1. 간접 세그웨이
    : 메인 뷰와 다음 화면을 segue로 연결 후 show를 선택하고 해당 storyboard Segue의 identifier의 이름을 정해주고 메인 뷰의 버튼과 메인 뷰컨을 IBAction으로 연결 후 performSegue로 넘긴다.
// 세그웨이를 실행한다는 의미의 메서드 호출
self.performSegue(withIdentifier: "toThirdVC", sender: self)

// 데이터 전달을 위해 prepare를 재정의
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        //print(#function)
   	if segue.identifier == "toThirdVC" {
        let thirdVC = segue.destination as! ThirdViewController
        thirdVC.someString = "안녕하세요"
            //thirdVC.mainLabel.text = "안녕하세요"    // 에러발생 (스토리보드 객체가 나중에 생김)
  1. 직접 세그웨이
    1 - 메인 뷰에 있는 버튼과 다음 화면을 segue로 연결 후 show를 선택한다.
    : perfome Segue를 호출하지 않아도 동일한 효과가 나타남.
    2 - identifier 설정해주고 메인 뷰컨과는 연결하지 않아도 된다.

    위 사진처럼 FourthViewController를 위한 performSegue는 없고 데이터 전달을 위해 prepare 밑에 toFourthVC만 있음.
  • shouldPerformSegue
    -> 결론 : 직접 세그웨이는 perfrom segue가 자체적으로 가능하기때문에 조건에 따라 다음 화면으로 넘길지 말지를 정하려면 shouldperformsegue를 꼭 사용해야한다(Bool로).
// 참고 - 4) 직접 세그웨이에서만 호출되는 메서드 : 뷰가 아닌 버튼으로 직접적으로 연결했을 경우만 가능
    // 조건에 따라 다음화면 이동할지/말지
    override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
        print(#function)
        if identifier == "toFourthVC" {
            return false
        }
        return true
    }

2번 방법이 제일 좋다.

0개의 댓글