iOS 화면 전환

ellyheetov·2021년 2월 13일
1
post-thumbnail

iOS에서 화면을 전환하는 방법에는 여러가지가 있다.

참조 관계

앱에서 화면을 전환은 서로 참조 관계가 성립한다.

무슨말이냐면

  • 화면을 전환하기위해 가장먼저 해야할 일은 전환 할 화면을 정하는 것이다.
  • 다음으로 내가 전환하고자 하는 화면의 View Controller의 인스턴스를 생성해야한다.
  • 이제 생성된 인스턴스를 불러들여 기존에 화면 위에 얹게된다.

이와 같은 과정으로 기존화면과 새로운 화면 사이에는 서로 참조 관계가 성립한다.

때문에 앱에서 화면 전환은 단순하지가 않은 것 같다. (데이터를 전달해야한다면 더더욱)

화면 전환방식 분류1

  1. 소스코드를 통해 전환하기
  2. Storyboard를 통해 전환하기

화면 전환방식 분류2

  • 뷰를 이용한 화면 전환
    - View Controller의 View 위에 다른 View를 가져와 바꿔치기하기

  • 뷰 컨트롤러에 의한 화면 전환
    - View Controller에서 다른 View Controller를 호출하여 전환하기
    - Navigation Controller를 사용하여 화면 전환하기
    - 화면 전환용 객체 세그웨이(Segueway)를 사용하여 화면 전환하기

1. 뷰를 이용한 화면 전환

하나의 뷰 컨트롤러는 하나의 루트 뷰를 관리한다.(MVC패턴에 따르면)
만약 뷰를 이용하여 화면을 전환한다면, 다른 뷰 컨트롤러에 의해 관리되고 있는 뷰를 가져와 관리해아하는 꼴이다. 뷰를 제어할 책임이 모호해 진다. 때문에 이는 MVC패턴에 위배되고, 잘 사용하지 않는다.

2. 뷰 컨트롤러에 의한 화면 전환

present

present(<새로운 뷰 컨트롤러 인스턴스>, animated: <애니메이션 여부>)
present(_: animated:completion:)  

화면전환은 비동기적으로 이뤄지므로, present 다음에 작성된 구문이 화면 전환이 끝난 후 호출됨을 보장할 수 없다. 이는 completion을 이용함으로써 해결할 수 있다. completion은 클로저를 사용하여 화면전환이 완전히 끝난 후에 호출되는 함수이다.

dismiss

dismiss(animated:)
dismiss(animated:completion:)

걷어낸 화면 뷰의 컨트롤러 객체는 운영체제에 의해 곧 메모리에서 삭제된다.

화면을 걷어내는 객체는 자기 자신이 아니다. VC1이 VC2를 불렀다고 가정한다면, VC2가 화면에서 걷어지기 위해서는 VC1이 일해줘야한다.

VC1이 VC2를 불러냈으므로, VC2를 걷어내는 것도 VC1이 해야할 일!

Example

// FirstViewController
@IBAction func nextButtonTouched(_ sender: Any) {        
        guard let yellowVC = self.storyboard?.instantiateViewController(identifier: "yellowVC") else { return }
        self.present(yellowVC, animated: true)
}
// YellowViewController
@IBAction func closeButtonTouched(_ sender: Any) {
//  self.dismiss(animated: true, completion: nil)
    self.presentingViewController?.dismiss(animated: true)
}

self.dismiss의 경우 VC2가 VC2를 걷어내는, 자기가 자기 자신을 사라지게 하는 함수이다.
VC1이 VC2를 불러냈으므로, VC2를 걷어내는 것도 VC1이해야할 일이라고 했다. 따라서 self.presentingViewControllerdismiss함수를 호출한다.

잠깐, self.presentingViewController.dismiss를 사용하지 않고 self.dismiss를 써도 잘 동작하는데??

self.dismissself.presentingViewController.dismiss의 동작은 사용자의 관점에서 전혀 차이를 느낄 수 없다. 이 두 함수의 차이는 completion 함수 구현 시 발생한다. dissmiss를 한 이후에 결과를 presentingViewController에게 알려주느냐 아니면 사라진 ViewController(self)에게 알려주느냐의 차이가 있다.

3. 네비게이션 컨트롤러를 이용한 화면 전환

네비게이션 컨트롤러는 현재 화면에 표시되고 있는 뷰 컨트롤러들을 내비게이션 스택(Navigation Stack)을 이용하여 관리한다. 가장 아래에 있는(= 가장 첫번째) 화면이 루트 뷰 컨트롤러이고, 최상위에 있는 화면이 현재 표시되고 있는 화면이다.

push

pushViewController(_: animated:)

pop

popViewController(aminated:)

4. 세그웨이(Segueway)를 이용한 화면 전환

세그웨이(Segueway)는 두 개의 View Controller 사이에 연결된 화면 전환 객체를 의미한다.
스토리보드를 통해 출발지와 목적지를 직접 지정하는 방식을 세그웨이(Segueway)를 이용한 화면전환이라고 한다. 화면 전환을 구현 하는 데 가장 단순한 방식이다.

Action Segueway 종류

  • Show
  • Show Detail
  • Present Modally
  • Present As Popover
  • Custom

Action Segueway

  • Show
    : navigation controller를 이용시 navigation stack에 쌓이게 된다. 왼쪽에서 오른쪽으로 화면이 나타나며 되돌아가기 버튼을 제공한다. 만약 navigation controller를 사용하지 않을 경우 presented modally와 동일하게 작동한다.
    Screen Shot 2021-02-13 at 9 19 39 PM

  • Show Detail
    : Split View Controller에서 다루게 된다. 2개의 column으로 나누어진 화면에서 오른쪽에 자세한 정보가 나타나게 된다.
    ex) Message
    Screen Shot 2021-02-13 at 9 18 14 PM

  • Present Modally
    : presentation option을 통해서 다양한 애니메이션을 적용할 수 있다. 이전 view controller를 덮으면서 새로운 화면이 나타나게 된다. 기본적으로는 아래에서 위로 새로운 화면이 덮혀지는 효과가 있다.
    ex) TouchID & Passcod in Settings
    Screen Shot 2021-02-13 at 9 09 48 PM

  • Present As Popover
    : IPad에서 동작시 destination이 나타나고 임임의 다른 곳을 선택시 자동으로 화면에서 사라지게 된다(dismiss)
    Screen Shot 2021-02-13 at 9 08 35 PM

  • Custom
    : 마음대로 세그웨이를 지정할 수 있다.

참고 ) https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/UsingSegues.html

profile
 iOS Developer 좋아하는 것만 해도 부족한 시간

0개의 댓글