앞서 공부한 세그웨이를 사용해서 화면을 전환할 경우 화면 복귀를 할 때는 2번째 뷰 컨트롤러에서 1번째 뷰 컨트롤러로 향하는 세그웨이를 추가해주면 될 것이라고 생각할 수 있다.
하지만 이렇게 할 경우 오류가 발생한다.
세그웨이는 목적지가 되는 뷰 컨트롤러의 인스턴스를 자동으로 생성해준다. 따라서 2번째-->1번째 뷰 컨트롤러로 새로운 세그웨이를 연결하면 기존에 존재하면 1번째 뷰 컨트롤러의 인스턴스 말고도 추가적으로 새로운 인스턴스가 하나 더 생기게 된다. 이렇게 되면 동일한 뷰 컨트롤러가 중복되기 때문에 앱에서 오류가 발생할 수 있다. 일반적으로 iOS에서 뷰 컨트롤러의 인스턴스는 한개 이상 존재해서는 안 된다!!
세그웨이에서 Unwind를 구현할 때도 앞에서 공부한 화면 복귀용 메소드를 이용할 수 있다.
- 뷰 컨트롤러 직접 호출(프레젠테이션 방식) : dismiss(animated:)
- 내비게이션 컨트롤러 사용 : popViewController(animated:)
또 다른 방법으로는 세그웨이 구조에서 제공하는 Unwind Segue를 이용하는 것이 있다.
스토리보드의 뷰 컨트롤러 상단 도크 바 아이콘 중에 오른쪽의 Exit 아이콘을 이용하여 Unwind Segue를 구현할 수 있다.
뷰 컨트롤러 화면 이동이 A --> B 로 이루어졌다고 했을 때, B --> A 로 다시 돌아가기 위한 Unwind Segueway의 구현 방법은 다음과 같다.
- 뷰 컨트롤러 A에 UIStoryboardSegue 타입의 인자값을 받는 @IBAction 액션 메소드를 정의한다(Unwind Segue 메소드). 이 때 메소드를 버튼과 연결할 필요는 없다.
- 뷰 컨트롤러 B에 버튼을 만들고 이를 Exit 아이콘에 드래그하여 트리거를 생성해준다.
- 버튼이 드래그된 Exit 아이콘은 1.에서 생성한 메소드를 인식하고, 이를 찾아 Unwind Segue로 자동 생성해준다.
여기서 버튼을 만들고 Exit에 드래그하는 곳은 뷰 컨트롤러 B 이지만,
Unwind Segue 메소드를 만드는 곳은 뷰 컨트롤러 A라는 점을 주의하자!!!
아래처럼 뷰 컨트롤러 A에 액션 메소드를 정의해준다.
그 다음 뷰 컨트롤러 B의 버튼을 exit로 드래그해주면
뷰 컨트롤러 A에 정의한 메소드가 자동으로 목록에 등장한다.
코코아 터치 시스템은 앱 내부에 정의된 모든 메소드를 스캔하여, UIStoryboard타입의 인자값을 입력받는 액션 메소드를 모두 수집한 다음 Exit의 목록으로 보여주게 되는 것이다.
이 중 하나를 선택하게 되면 해당 메소드가 정의된 뷰 컨트롤러로 돌아가는 Unwind 메소드가 만들어진다.
'iOS' 카테고리의 다른 글
[ iOS ] 코코아팟 설치 후 라이브러리 추가하기 (0) | 2023.02.28 |
---|---|
[ iOS ] 화면 전환 시 값 전달 방식 (UIKit) (0) | 2023.02.15 |
[ iOS ] 화면 전환 방식 (UIKit) (0) | 2023.02.10 |
[ iOS ] 코코아 터치 프레임워크의 주요 프레임워크와 접두어 정리 (0) | 2023.02.08 |
[ iOS ] iOS 앱의 생명 주기 (UIKit) (0) | 2023.02.08 |