[iOS/Swift] 화면 전환 present와 pop이 동시에 필요할 때

chaentopia·2023년 2월 9일
0

iOS 1주차 과제 화면 전환에 대한 부분을 구현 중,

navigation을 이용해서 1번에서 2번으로 전환,
modal을 이용해서 1번 화면에서 3번 화면으로 / 2번에서 3번 화면으로 화면 전환 후
3번 화면에서는 dismiss를 통해서 1번 화면으로 돌아가야 하는 상황이었다.

1번 ➡️ 3번 ➡️ 1번 : 이건 3번에서 1번 화면으로 갈 때 dismiss를 함수 안에 구현하며 해결할 수 있었다

@objc
    private func touchupCompleteButton() {
        self.dismiss(animated: true, completion: nil)
    }

이건 어려운 건 아니니까 코드 한 줄로 구현 가능

그러나 문제는...

1번 ➡️ (present) 2번 ➡️ (push) 3번 ➡️ (dismiss?? pop??) 1번
이 중 3번 ➡️ 1번에서 dismiss를 써야 하는지 pop을 써야하는지 동시에 써야 하는지 의문이 생겼다.

왜냐...

이미 네비게이션 컨트롤러 안에 1번과 2번이 쌓여있는 상태이기 때문에!!
3번에서 modal을 써서 push를 하고 1번으로 돌아가기 위해서는 dismiss 한 번과 pop 한 번이 필요한 상태이다.

해결책은?

결과이자 해결 방법부터 말하자면 1번으로 돌아가기 위해서 2번 화면에서 3번 화면으로 갈 때 push를 함과 동시에 네비게이션 컨트롤러 안에 있는 2번 화면을 pop 해줘야 한다.

2번 화면의 함수에서

private func presentToWelcomeVC() {
      let welcomeVC = WelcomeViewController()
      welcomeVC.modalPresentationStyle = .formSheet
      self.present(welcomeVC, animated: true, completion: nil)
  }
  
  @objc
  private func touchupNewAccountButton() {
      self.navigationController?.popViewController(animated: true)
	  presentToWelcomeVC()
  }

이렇게 2번 화면에 대한 pop을 진행하고, 3번 화면에 대한 present를 했더니

엥.. pop만 되고 present는 되지 않는다

왜지???

@objc
  private func touchupNewAccountButton() {
	  presentToWelcomeVC()
      self.navigationController?.popViewController(animated: true)
  }

혹시나 해서 present와 pop의 순서를 바꿔보았더니

3번 화면이 나오며 원활히 해결이 되었다!!

결론

present와 pop이 동시에 필요하다면 present 후, 네비게이션 컨트롤러 안에 있는 뷰컨트롤러를 나중에 pop 시켜줘야 한다!

추가 설명이나 다른 방법, 틀린 것이 있다면 언제든지 댓글 주세요!!!

profile
the pale blue dot

0개의 댓글