[iOS] 화면 전환

chaaansooo·2022년 4월 30일
1

iOS

목록 보기
1/8
post-thumbnail

화면 전환을 하는 두가지 방법

  1. 소스 코드를 통해 전환하는 방식
  2. 스토리보드가 제공하는 기능을 통해 전환하는 방식

화면 전환 분류

  1. 뷰 컨트롤러의 뷰 위에 다른 뷰를 가져와 바꿔치기
  2. 뷰 컨트롤러에서 다른 뷰 컨트롤러를 호출하여 화면 전환
  3. 네비게이션 컨트롤러를 사용하여 화면 전환
  4. 화면 전환용 객체 세그웨이를 사용하여 화면 전환

1번을 제외한 세가지 방법은 뷰 컨트롤러를 호출하는 방식으로 이루어짐

iOS에서의 화면 전환의 특성

  1. 다음 화면으로 이동하는 방법과 이전 화면으로 되돌아가는 방법이 다름
    • 다음 화면으로 이동하는 과정은 기존 화면에 +1을 하는 방식이고 되돌아가는 방식은 -1을 하는 방식
    • 여기서 되돌아갈 때 이전 화면을 +1하게 되면 같은 화면이 두개가 띄워져있는 상황이 발생
  2. 화면 전환 방식에 따라 이전 화면으로 되돌아가는 방법이 다름
    • 화면을 전환하는 방식에 따라 알맞은 되돌아가는 방법을 사용해야함

뷰를 이용한 화면 전환

하나의 뷰컨 안에 두 개의 루트 뷰를 준비하고 상태에 따라 교체해주는 방법.
MVC 패턴을 거스르는 방식이라 추천하지 않음.

뷰 컨트롤러 직접 호출에 의한 화면 전환

현재 뷰컨에서 이동할 대산 뷰컨을 직접 호출해서 화면을 전환하는 방식
프레젠테이션 방식이라고도 함

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

다음과 같이 프레젠트 메소드를 호출해서 뷰컨을 호출
화면 전환은 비동기 방식으로 진행되기 때문에 화면 전환이 완전이 끝난 후에 실행해야 할 구문이 있다면 completion 와 같은 클로저를 인자로 전달해주어야함

기존 뷰컨을 그대로 둔 채 그 위에 새로운 뷰컨의 화면으로 덮는 방식
두 뷰컨은 포인터로 연결되어 있어 present함수를 호출하는 뷰컨에서는 presentedViewController 속성을 이용하여 전환할 뷰컨을 제어할 수 있고 반대로는 presentingViewController 속성을 이용하여 참조할 수 있다.

이전 화면으로 복귀할 때는

self.presentingViewController.dismiss(animated: , completion: )

메소드를 사용해서 복귀할 수 있다.
dismiss된 뷰컨은 메모리에서 곧 사라짐

여기에서 dismiss를 실행시켜주는 주체는 현재 뷰컨이 아니라 현재 뷰컨을 호출한 presentingViewController이다.

  • 두 개의 뷰 컨트롤러를 스토리보드에 추가한다
  • 뷰 컨트롤러를 참조하기 위해서 스토리보드의 속성값을 이용해야하므로 속성값을 입력해준다

뷰컨 호출 예시

//이동할 뷰컨 객체를 storyboardID 정보를 이용하여 참조
guard let uvc = self.storyboard?.instantiateViewController(withIdentifier: "SecondVC") else { 
	return 
}

//화면 전환할 때 애니메이션 타입
uvc.modalTransitionStyle = UIModalTransitionStyle.coverVertical

//프레젠트 메소드로 뷰컨 호출
self.present(uvc, animated: true)

만약 하나의 storyboard에 모든 UI가 들어가있는 것이 아니라면

let storyboard = UIStoryboard(name: "스토리보드 파일 이름", bundle: 스토리보드 파일을 읽어드릴 위치)

커스텀 클래스는 무조건 뷰컨과 연결해줘야함다!

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

  • 네비게이션 컨트롤러

    • 뷰 컨트롤러의 특별한 종류로, 계층적인 성격을 띠는 컨텐츠 구조를 관리하기 위한 컨트롤러
    • 앱의 네비게이션을 표시해줄 수 있는 네비게이션 바가 내장되어 있음
    • 뷰 컨트롤러들의 전환을 직접 컨트롤
    • 앱의 네비게이션 정보를 표시
    • 화면 전환이 발생하는 뷰컨들의 포인터를 스택으로 관리해서 접근을 쉽게 함
    • 직접 컨텐츠를 담고 화면을 구성하지 X
  • 루트 뷰 컨트롤러

    • 네비게이션 컨트롤러에 직접 연결된 컨트롤러
    • 컨텐츠 계층 구조의 시작점 역할을 함
    • 화면 하단에 네비게이션 바가 표시

네비게이션 컨트롤러는 뷰컨들을 네비게이션 스택을 이용하여 관리

  • 스택 가장 아래: 루트 뷰 컨트롤러
  • 가장 위: 현재 뷰 컨트롤러
//스택 최상위에 뷰컨 추가
pushViewController(_: animated:)

//최상위 스택 뷰컨 제거
popViewController(animated:)

세그웨이를 이용한 화면 전환

  • 세그웨이
    스토리보드에서 뷰컨 사이의 연결 관계 및 화면 전환을 관리하는 역할

뷰컨에 대한 정보 없이 화면 전환 가능

  • 소스코드를 이용한 화면 전환은 대상 뷰컨의 정보를 읽어와 인스턴스화한 다음 화면을 전환

화면을 되돌아가는 건 어떻게 할까?

  • 세그웨이를 양방향으로 연결하면 안된다!
    이전에서 말했던 것과 같이 첫번째 뷰컨이 두개가 띄워지는 효과이므로
  • Unwind segue를 이용한다!

화면을 전환하는 과정에서 특별한 처리를 해줘야 할 때(세그웨이 실행 전 값 저장, 경고창 등)
-> 전처리 메소드를 사용

 prepare(for segue: UIStoryboardSegue, sender: Any?){}
profile
악으로 깡으로 버티기

0개의 댓글