모든 코드에서는 이동할 또는 돌아갈 ViewController를 미리 인지하고 그에 맞게 class를 변환해서 데이터를 넣어주었습니다. 그런데, Segue는 그런 과정이 없습니다. Segue를 통한 이동시에는 해당 Segue를 identifier를 통해서 호출하기만 했습니다. 그러면 데이터를 넣어주는 시점이 언제일까?
- prepare()를 통해서 segue를 통한 이동/반환시에 해당 목적지를 구분해서 데이터를 넣어줍니다.
비동기식은 별도의 저장소를 두고 그곳에 데이터를 저장하고, 상호 데이터를 조회하는 방식입니다.
갑을 주고받는다기 보다는 글로벌한 곳에 데이터를 두고 상호참조하는 방식으로 이해하면 됩니다.
그러면 어디에 데이터를 저장하고 읽고, 쓰기를 진행하면 될까요.
1. AppDelegate를 이용한 접근
Swift의 모든 개체가 다 접근할 수 있는 AppDelegate class가 적합합니다.
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var paramEmail: String?
var paramUpdate: Bool?
var param.....
여기에 변수를 정의합니다.
그러면 해당 데이터는 어떻게 접근할까요?
@IBAction func onSubmit(_ sender: Any){
let ad = UIApplication.shared.delegate as? AppDelegate
ad?.paramEmail = self.email.text
..
다음과 같이 UIAppliation에 접근해서 데이터를 바로 읽고, 쓰면 됩니다.
2. UserDefaults 객체를 이용한 방법
iOS에는 코코아 터치 프레임워크가 있습니다. iOS의 전통적인 프레임워크이고 swift에서도 사용이 가능합니다. 이 개체의 장점은 앱을 삭제하기 전까지는 반영구적으로 사용이 가능하다는 것입니다.
내부적으로 plist파일을 이용하여 값을 저장관리합니다. 기존에는 UserDefaults객체에 NSData, NSString, NSNumber와 같이 코코아 프레임워크에서 사용하는 데이타타입만 저장이 가능하지만, Swift에서는 기본 데이터타입도 저장관리가 가능해진 부분이 있습니다.
Segue는 화면간의 연결을 표시하는 링크와 같다고 저는 이해했습니다. 그것의 이름이 Segue고요.
No Coding환경에서 Segue는 굳이 이름이 없어도 되는 경우가 많습니다. 하지만, 이건 기존 개발자들에게는 매우 불안한 요소입니다. 왜 불안하냐면.. 그냥 이름이 없으니까요.
코딩없이 우리가 Segue를 이용한것을 "Action Segue"라고 합니다. 버튼, 테이블 셀의 이벤트 트리거에 자동으로 연결이 되기 때문입니다.
이건 굳이 우리가 프로그래밍 하지 않아도 되고, Storyboard를 통해서 직관적(?)으로 알 수 있습니다.
사실 직관적이지는 않죠. 화면이 많으면 더더욱.. 하지만 코딩을 하지 않는것이 어디입니까.
이것말고 우리는 프로그램으로 제어하는 방법을 알려드리고자 합니다. 이걸 "Manual Segue"라고 합니다.
Action Segue는 버튼과 같은 컨트롤과 ViewController간의 관계입니다. 그렇기 때문에 해당 버튼의 동작과 연결시킬 수 있었습니다. 하지만, Manual Segue는 ViewController간의 관계를 정의해주고 이름을 명명해줘야 합니다. 역시 그림으로 설명합니다.
이제 우리는 Segue의 이름을 정해줘야 합니다.
이제 버튼을 누르면 Segue를 통해서 화면전환하는 코드를 작성합니다. 이때 사용하는 함수와 예제 코드는 다음과 같습니다.
위 코드뭉치를 보면 wind를 통해서 해당 segue와 연결된 ViewController로 이동을 하게 됩니다. 그런데 복귀되는 함수도 같이 있습니다. 즉, 이 함수를 통해서 우리는 현재의 ViewController로 돌아오게 됩니다.
ViewController에는 항상 위에 3개의 버튼이 있습니다. 그중에 가장 마지막에 "Exit"가 이런 unwind함수들과 연결이 됩니다.
unwind함수를 만드는것은 간단합니다. 함수 parameter에 (_ segue: UIStoryboardSegue) 만 정의하면됩니다. 그러면 swift가 전체 코드에서 다음과같은 parameter가 있는 함수들 리스트를 보여주고, 우리는 돌아갈 ViewController의 unwind함수만 선택하면 됩니다.
위에 그림을 보면 왼쪽에 Exit 바로 밑에 unwind가 있는것을 볼 수 있습니다.
물론 전에 unwind함수를 표시하므로 내가 가야할 곳의 ViewController의 함수를 잘 선택해야 합니다.
휴.. 지금까지 속성으로 화면전환을 정리했습니다.
기존 개발자는 화면 컨트롤만으로 동작하는게 너무 힘들었습니다. 하지만, 익숙해지면 되는문제였습니다. 다만, 한번에 코드안에서 파악이 안된다는것은 아직도 생소합니다.
네비게이션 컨트롤러는 다양한 페이지들이 서로 연관이 있다면 호출하고 다시 되돌아오는데 기본적인 편리성을 제공하는 View Controller입니다.
기존에 present는 화면전화 및 복귀를 내가 직접 코딩해야 했고, 복귀할때 적어도 1개의 버튼을 만들어야 했지만, Navigation Controller는 이러한 부분을 자동화 해준다고 보면됩니다.
기존 오래된 개발자 입장에서는 이 부분을 어떻게 이해해야 하나 고민했지만, 역시 오래보면 익숙해진다고, 그냥 익숙해지면 됩니다.
Navigation Controller를 만들기 위해서는 처음부터 Navigation Controller를 화면에 추가하거나, 기존의 ViewController에 Navigation Controller를 embed시키면 됩니다. 말로 풀어쓰면 어렵고, 화면을 보고 설명합시다.
Library에서 Navigation Controller를 추가합니다. 이러면 다음과 같이
표시가 됩니다. 기본적으로 Table View Controller가 추가가 됩니다. 여기서 Table View Controller안에 컨트롤을 삭제하고 마치 새것처럼 작업해도 됩니다.
저는 이 방법보다는 기존에 사용하던 View Controller가 있다면, 거기에 Navigation Controller를 추가하는게 더 맘에 편합니다. 이 방법은
그림에 자세히 설명이 되어있습니다. View Controller를 선택하고, Editor/Embed In/Navigation Controller를 선택하면 됩니다.
그렇습니다. 이렇게 자동으로 뒤로가기가 생성이 됩니다. 물론 Navigation Controller와 연결을 시켜야 하지만요.
연결여부는 여기를 통해서 확인됩니다. Show 형태로 되었습니다. 이건 뭘 의미할까요.
사실 이러한 연결은 No coding형태입니다. Present에서도 이야기 드렸듯이 코딩으로 또는 No coding으로 구현이 가능합니다.
여기서 조심해야 할것은 NavigationController를 이용하게 되면 우리 의지와는 상관없이 NavigationItem이 추가로 생성되고, 왼쪽에 뒤로가기 버튼이 자동으로 생성된다는 것입니다. UI충돌을 막기 위해서는 View Controller의 왼쪽상단에 Navigation Item이 생성되는것을 고려한 UI디자인이 필요합니다.