1번을 제외한 세가지 방법은 뷰 컨트롤러를 호출하는 방식으로 이루어짐
하나의 뷰컨 안에 두 개의 루트 뷰를 준비하고 상태에 따라 교체해주는 방법.
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: 스토리보드 파일을 읽어드릴 위치)
커스텀 클래스는 무조건 뷰컨과 연결해줘야함다!
네비게이션 컨트롤러
루트 뷰 컨트롤러
네비게이션 컨트롤러는 뷰컨들을 네비게이션 스택을 이용하여 관리
//스택 최상위에 뷰컨 추가
pushViewController(_: animated:)
//최상위 스택 뷰컨 제거
popViewController(animated:)
뷰컨에 대한 정보 없이 화면 전환 가능
화면을 되돌아가는 건 어떻게 할까?
화면을 전환하는 과정에서 특별한 처리를 해줘야 할 때(세그웨이 실행 전 값 저장, 경고창 등)
-> 전처리 메소드를 사용
prepare(for segue: UIStoryboardSegue, sender: Any?){}