관리 메뉴

사과하는 제라스

[Swift 기능] 화면 간 이동을 구현해보자! 4가지 방법으로(with Segue) 본문

제라스의 Swift 공부/Swift 기능

[Swift 기능] 화면 간 이동을 구현해보자! 4가지 방법으로(with Segue)

Xerath(제라스) 2023. 9. 26. 16:50

목차

    728x90
    반응형

    어느 앱이든 간에 하나의 화면이 아닌 여러 화면 간의 이동을 구현이 당연시 된다.

    그렇기에 'A 화면에서 어떤 동작을 하면 B 화면으로 이동하도록 만드는 방법'을 알아야 한다.

     

    Swift에는 화면 이동 방식을 다음과 같이 크게 4가지로 나눈다.

     

    1. 코드로만 구현

    2. 스토리보드를 활용하여 구현

    3. 간접 세그웨이로 구현(Storyboard로 화면 간의 연결)

    4. 직접 세그웨이로 구현(Button을 통해 직접 화면 연결)

     

    1. 코드로만 구현

    //present를 통해서 지정한 View Controller로의 이동을 구현할 수 있다.
    @IBAction func codeNextButtonTapped(_ sender: UIButton) {
        let firstVC = FirstViewController()
        firstVC.someString = "아기상어"
        present(firstVC, animated: true, completion: nil)
    }

     

    2. 스토리보드를 활용하여 구현

    //이것도 마찬가지로 present를 통해 화면 이동을 구현하지만 storyboard를 통해 화면을 만들고,
    //그 화면에 View Controller 파일을 명시(할당?)해준 뒤 사용한다.
    @IBAction func storyboardWithCodeButtonTapped(_ sender: UIButton) {
        guard let secondVC = storyboard?.instantiateViewController(withIdentifier: "secondVC") as? SecondViewController else { return }
        secondVC.someString = "아빠상어"
        present(secondVC, animated: true, completion: nil)
    }

     

    이 방식은 1번 방식과는 사뭇 다른 코드로 VC를 들고온다.

    let firstVC = FirstViewController()
    guard let secondVC = storyboard?.instantiateViewController(withIdentifier: "secondVC") as? SecondViewController else { return }

    딱 봐도 둘이 다르긴 한데, 이것의 차이는 스토리보드를 사용해서 만들었냐의 차이다. 1번 방식처럼 구현하게 된다면 스토리보드에서의 설정한 내용을 들고오질 못한다. 이것은 스토리보드와 실제 뷰가 렌더링되는 시점에서의 차이 때문에 생긴다.(스토리보드가 더 늦게 렌더링되기에 1번 방식으로 하면 못들고 온다는 것이다.)

     

    그리고 가장 크게 다른 점은 Main.storyboard에 화면이 있냐없냐로도 볼 수 있다. 하하하...너무 당연한 소리를 하네..

    3. 간접 세그웨이로 구현(Storyboard로 화면 간의 연결)

    @IBAction func storyboardWithSegueButtonTapped(_ sender: UIButton) {
            performSegue(withIdentifier: "toThirdVC", sender: self)
    }
    
    //performSegue에서 자동으로 호출함.
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "toThirdVC" {
            let thirdVC = segue.destination as? ThirdViewController
            thirdVC?.someString = "엄마상어"
        }
    
        if segue.identifier == "toFourthVC" {
            let fourthVC = segue.destination as? FourthViewController
            fourthVC?.someString = "냐냐냐냐냐"
        }
    }

    이 방식은 일단 Storyboard로 두 View Controller를 만든 뒤 이동을 할 화면으로 Control버튼을 누른 채 끌어당겨 두어 구현한다.

    performSegue라는 View Controller의 내장된 함수를 실행시켜서 어떤 segue를 쓸지 identifier로 정하여 이동한다.

    그때 자동으로 prepare함수가 실행된다.

     

    prepare 함수에서는 입력으로 들어온 segue의 identifier를 이용해서 VC의 type을 결정하면 되고, 이때 캐스팅 과정을 거쳐서 해당 VC 인스턴스에 접근하여 데이터를 전송할 수 있다.

     

    4. 직접 세그웨이로 구현(Button을 통해 직접 화면 연결)

    override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
        return true
    }

    직접 세그웨이를 연결하는 방식은 간단하다. 3번 방식과는 달리 화면-화면이 아닌 버튼-화면으로 연결한다. IBAction을 만들어내듯 스토리보드에서 버튼으로부터 긁어다가 화면에 연결하면 된다. 이때, 화면으로 이동하는 기능의 동작 여부를 위의 shouldPerformSegue 함수를 통해 명시할 수 있다.

     

    shouldPerformSegue는 VC의 내장함수이기에 오버라이드해서 구현한다. 아래 설명과 같이 default 동작은 true다.(항상 버튼이 동작한다는 뜻!)

     

     

    이렇게 다양한 방식들을 통해 화면 간의 이동 + 화면 간의 데이터 전송을 구현할 수 있다. 이중 보통 많이 쓰는 방식은 2번 방식이라고 한다. 또한, 세그웨이는 사실 현업에서는 잘 채택되진 않는 방식이라고 한다. 물론 세그웨이를 사용하는 방식을 아는 것도 중요하긴 하기에 다양한 구현방식을 알아두도록 하자.

    728x90
    반응형