Segue로 ViewController 전환

  1. StoryBoard 내의 버튼에 Segue 추가하기
  2. StoryBoard 내의 VC에 Segue 추가하고 Segue Identifier 지정하기
  3. StoryBoard 내의 VC에 Identifier 지정하기

1번 방법

버튼으로 Segue추가

위와 같은 방법으로 Tap했을 때 Segue를 발생시키고 싶은 버튼을 Ctrl+드래그 한다.

해당 Button을 클릭했을 때, 이동하고 싶은 VC에 드래그한다.

 

이렇게 설정해놓으면 EditButton을 Tap하게 되면 LoginVC로 이동하는 것을 볼 수 있다.

 

데이터 전달

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if let loginVC = segue.destination as? LoginViewController{
                loginVC.nameText = self.nameLabel.text ?? "name"
                loginVC.descriptionText = self.descriptionLabel.text ?? "description"
            }
        
    }

Presenting VC에서 prepare 메소드를 재정의한다.

destination은 Presented VC가 되고 옮기고 싶은 데이터들을 옮겨주면 된다.

이때, LoginViewController는 아직 메모리에 올라가지 않았기 때문에, IBOutlet 에는 접근할 수 없다.


2번 방법

VC에서 Swgue 추가

위와 같은 방법으로 Segue를 발생시키고 싶은 VC를 Ctrl+드래그한다.

해당 VC에서 이동하고 싶은 VC에 드래그한다.

Segue Identifier

생성된 Segue에 Identifier를 지정해준다.

나는 Profile에서  Login으로 가는 Segue이기 때문에, ProfileToLogin이라고 지었다.

이때, 복잡한 UI와 애니메이션이 들어가는 App을 개발할 때는 Modal방식인지 직접 커스텀한 애니메이션을 가진 방식인지에 따라서 네이밍을 더 복잡하게 하기도 한다.

@IBAction func tappedEditButton(_ sender: Any) {
        performSegue(withIdentifier: "ProfileToLogin", sender: nil)
        
    }

EditButton을 눌렀을 때, 이동시키기 위해 IBAction에 performSegue를 넣어주었다.

이때, withIdentifier에는 위에서 네이밍한 Swgue Identifier를 적어주면된다.

 

EditButton을 Tap하게 되면 LoginVC로 이동하게 된다.

 

데이터 전달

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "ProfileToLogin"{
            if let loginVC = segue.destination as? LoginViewController{
                loginVC.nameText = self.nameLabel.text ?? "name"
                loginVC.descriptionText = self.descriptionLabel.text ?? "description"
            }
        }
        
    }

또한, Presenting VC에서 하나의 Segue만 가지고 있을 때는 상관없는데, 만약 2개 이상의 Segue를 처리하게 된다면

prepare에서 발생한 Segue의 Identifier를 확인하여 원하는 데이터 전달을 구현할 수 있다.

 

 


3번 방법

@IBAction func tappedEditButton(_ sender: Any) {
        if let loginVC = self.storyboard?.instantiateViewController(withIdentifier: "LoginViewController") as? LoginViewController{
            present(loginVC, animated: true, completion: nil)
        }
    }

코드만 사용해서 EditButton을 Tap했을 때 LoginVC로 이동하게 된다.

 

이렇게만 해서는 안되고 한단계가 더 있다.

 

위의 withIdentifier에 들어가는 값은 LoginViewController의 타입이 아닌 String이다!

눈치 빠른 분들은 아셨겠지만, Segue에 Identifier를 설정한 것처럼 VC에도 Identifier를 설정가능하다.

VC Identifier 설정

그림처럼 VC에 Identifier를 설정하면 된다.

데이터 전달은 present(...)하기 전에 데이터를 전달하면 된다.

+ Recent posts